构造函数
派生类的对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成。将派生类的对象中由基类中说明的数据成员和操作所构成的封装体称为基类子对象,它由基类中的构造函数进行初始化。
构造函数不能够被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象时,还应包含对子对象初始化的构造函数。
派生类构造函数的一般格式如下:
〈派生类名〉(<派生类构造函数总参数表>):<基类构造函数>(<参数表1>), <子对象名>(<参数表2>)
{
<派生类中数据成员初始化>
};
派生类构造函数的调用顺序如下:
基类的构造函数 ----------→子对象类的构造函数 ----------→派生类的构造函数
当对象被删除时,派生类的析构函数被执行。由于析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数时的顺序正好相反。
多重继承的构造函数和析构函数的执行顺序:
//此处不做注释和说明了,看程序能读懂的
#include
using namespace std;
class base1
{
private:
int x1;
public:
base1(int y1)
{
x1 = y1;
cout<<"基类1构造函数执行..."<<"x1= "<
}
~base1(){cout<<"base1 析构了...\n";}
};
class base2
{
private:
int x2;
public:
base2(int y2)
{
x2 = y2;
cout<<"基类2构造函数执行..."<<"x2= "<
}
~base2(){cout<<"base2 析构了...\n";}
};
class base3
{
private:
int x3;
public:
base3(){cout<<"构造基类3...\n";}
~base3()
{
cout<<"基类3析构了...\n";
}
};
//多重继承派生类的构造函数是按照声明的顺序执行的...
class derived:public base2,public base1,public base3
{
private:
base1 obj1;
base2 obj2;
base3 obj3;
public:
derived(int x,int y,int z,int v):base1(x),base2(y),obj1(z),obj2(v)
{
cout<<"派生类构造函数执行...\n";
}
~derived(){cout<<"派生类析构函数执行...\n";}
};
int main()
{
derived ob(1,2,3,4);
return 0;
}
多重继承
阅读(4113) | 评论(0) | 转发(0) |