构造函数调用顺序
- 基类构造函数:首先调用基类构造函数,按照它们在类继承(类派生表)中的顺序调用,而不是它们在成员初始化表中的顺序。
- 成员对象的构造函数:在基类构造函数之后,会调用成员类对象的构造函数。成员类对象的构造函数调用顺序是按照它们在类中声明的顺序来执行,而不是它们在成员初始化表中的顺序。
- 派生类构造函数:最后执行派生类构造函数。
析构函数调用顺序
- 调用派生类的析构函数:首先调用派生类的析构函数。
- 调用成员类对象的析构函数:在派生类析构函数之后,会调用成员类对象的析构函数,按照它们在类中声明的顺序反着执行。
- 调用基类的析构函数:最后调用基类的析构函数,按照它们在类继承(类派生表)中的顺序反着执行。
验证代码:
#include<iostream>
using namespace std;
class A {
public:
A() {
cout << "A constructor" << endl;
}
~A() {
cout << "A deconstructor ~~~" << endl;
}
};
class B {
public:
B() {
cout << "B constructor" << endl;
}
~B() {
cout << "B deconstructor ~~~" << endl;
}
};
class Member1 {
public:
Member1() {
cout << "Member1 constructor" << endl;
}
~Member1() {
cout << "Member1 deconstructor ~~~" << endl;
}
};
class Member2 {
public:
Member2() {
cout << "Member2 constructor " << endl;
}
~Member2() {
cout << "Member2 deconstructor ~~~" << endl;
}
};
class Derived :public A, public B { //类继承(类派生表)的顺序是先A,再B
public:
Member1 member1;
Member2 member2;
Derived() : B(), A() { //不是按这个成员初始化列表的顺序调用类A,B的构造函数和析构函数的
cout << "Derived constructor" << endl;
}
~Derived() {
cout << "Derived deconstructor ~~~" << endl;
}
};
int main() {
Derived obj;
return 0;
}
结果展示: