c++类对象的初始化顺序,有多重继承的初始化顺序
#include <iostream>
using namespace std;
class A
{
public:
A(){ cout<<"A"<<endl;}
virtual ~A(){ cout<<"~A"<<endl; }
};
class B: public A
{
public:
B(){ cout<<"B"<<endl;}
~B() {cout<<"~B"<<endl; }
private:
A a;
};
class C: public A, public B //类在派生表中的继承列表
{
public:
C() {cout<<"C"<<endl;}
~C() {cout<<"~C"<<endl; }
private:
public:
A a;
B b;
};
int main()
{
C * p = new C;
delete p;
return 0;
}
初始化优先级
父类构造函数–>成员类对象构造函数–>自身构造函数
其中成员变量的初始化与声明顺序有关:这句话是指C类中的成员变量A a和B b 顺序不一样,输出的结果也会不一样。
构造函数的调用顺序是类派生列表中的顺序:这句话是指C类的继承public A和publicB调换顺序,输出结果也会不一样。
输出结果:
A // A类的构造函数体
A // 调用父类A的构造函数体
A // 当B类调用构造函数体时,先对B类中的数据成员 A a初始化
B // B类构造函数体
A // C类成员变量 A a初始化
A // C类成员变量 B b初始化
A
B
C // C类的构造函数体
析构相反我就不写了。
构造函数的作用就是对对象进行初始化,构造函数=(如果存在继承先调用基类的构造函数)+(然后对成员变量初始化)+(构造函数函数体)就连这句话的解释也是嵌套的,有点像递归。
也就是说 A是A类的构造函数,AAB是B类的构造函数,AAABAAABC是C类的构造函数。
反正是存在嵌套关系的很抽象难以理解,用上面的代码自己试一试,才容易理解。