300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > c++中的派生类构造函数和析构函数

c++中的派生类构造函数和析构函数

时间:2019-10-10 21:55:41

相关推荐

c++中的派生类构造函数和析构函数

1.派生类构造函数

派生类的构造函数必须自己定义,因为要对新增数据成员进行初始化。如果想要同时初始化基类的数据成员,必须调用基类的构造函数。

创建一个派生类对象的时候,首先调用基类的构造函数,再调用派生类的构造函数。对于析构函数,则先释放派生类再释放基类。

例子:

#include <iostream>#include <string>using namespace std;class St1{public://基类构造函数,初始化成员变量St1(int n, string na, char se):num(n),name(na),sex(se){cout<<"St1"<<endl;}~St1(){cout<<"~St1"<<endl;}protected:int num;string name;char sex;};class St2:public St1{public://派生类调用基类构造函数St2(int n, string na, char se, int a, string add):St1(n,na,se),age(a),addr(add){cout<<"St2"<<endl;}~St2(){cout<<"~St2"<<endl;}void display(){cout<<num<<'\t'<<name<<'\t'<<sex<<'\t'<<age<<'\t'<<addr<<endl; }private:int age;string addr;};int main(){St2 s(200, "ace", 'M', 25, "Hangzhou");s.display();return 0;}

这里将会输出:

St1

St2

200 ace M 25 Hangzhou

~St2

~St1

例子2:包含子对象的派生类构造函数

#include <iostream>#include <string>using namespace std;class St1{public://基类构造函数,初始化成员变量St1(int n, string na, char se):num(n),name(na),sex(se){cout<<"St1"<<endl;}~St1(){cout<<"~St1"<<endl;}void display1(){cout<<num<<'\t'<<name<<'\t'<<sex<<'\t'; }protected:int num;string name;char sex;};class St2:public St1{public://派生类调用基类构造函数St2(int n, string na, char se, int n_m, string na_m, char se_m, int a, string add):St1(n,na,se),monitor(n_m,na_m,se_m){age = a; addr = add;cout<<"St2"<<endl;}~St2(){cout<<"~St2"<<endl;}void display2(){display1();cout<<age<<'\t'<<addr<<endl; }void showmonitor(){cout<<"Monitor is:"<<endl;monitor.display1();cout<<endl;}private:int age;string addr;St1 monitor;//包含子对象};int main(){St2 s(200, "ace", 'M', 11, "HH", 'M', 26, "Shanghai");s.display2();s.showmonitor();return 0;}

输出:

St1

St1

St2

200 ace M 26 shanghai

Monitor is:

11 HH M

~St2

~St1

~St1

注意事项:

1)在调用派生类构造函数之前,系统会先调用基类的构造函数;如果派生类构造函数列表中包含对基类子对象成员的初始化(如上例中的monitor),每个基类子对象初始化时也要调用一次基类构造函数;最后才是派生类调用自身的构造函数来初始化自身新增的成员(如上例中的age,addr)。执行顺序就是派生类构造函数列表顺序:

St2(int n, string na, char se, int n_m, string na_m, char se_m, int a, string add):St1(n,na,se)[1],monitor(n_m,na_m,se_m)[2]

{age = a; addr = add;cout<<"St2"<<endl;}[3]

2)当然,对上述三种类型进行参数初始化时,会出现以下几种特殊情况:

(a) 派生类新增成员不需要进行初始化(很常见):

St2(int n, string na, char se, int n_m, string na_m, char se_m):St1(n,na,se)[1],monitor(n_m,na_m,se_m)[2]{}

(b)基类没有定义构造函数或者基类构造函数无参—调用基类默认构造函数

St2(int a, string add ){age = a; addr = add;cout<<”St2”<

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。