按照继承声明顺序,初始化基类对象
初始化x的成员对象
调用x的构造函数
对于例,写出一个对象的构造和析构过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <iostream> using namespace std;
class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; }
};
class B { public: B() { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; } private: A a; };
class Test : public A, public B { public: Test() { cout << "Test()" << endl; } ~Test() { cout << "~Test()" << endl; }
private: B ex1; A ex2; };
int main() { Test ex; return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 构造 1. 根据继承声明顺序,初始化基类对象 1.1 初始化A类对象 1.1.1 初始化A类成员对象,因为没有成员对象,就没有这步 1.1.2 调用A类成员函数,构造A A(); 1.2 初始化B类对象 1.2.1 初始化B类成员对象 1.2.1.1 包含A类对象,初始化A,A中没有成员对象,就直接调用构造 A() 1.2.2 调用B类构造函数 B();
2.初始化当前派生类的成员对象 2.1 包含B类成员,初始化B类成员对象,包含A类成员对象 A() 2.1.1 构造B类 B() 2.2 包含A类成员,初始化A类成员对象,调用A类构造函数 A() 3.调用当前派生类的构造函数 Test()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 析构,析构的顺序和构造的顺序是反着的,所以可以直接得出 ~Test(); ~A(); ~B(); ~A(); ~B(); ~A(); ~A(); 1.析构当前派生类对象 ~Test(); 2.析构 当前派生类的成员对象,按照声明顺序逆序 2.1 析构A ~A(); 2.2 析构B B中包含A类成员变量 ~B(); ~A(); 3.按照继承列表逆序,析构继承类的对象 3.1 B中包含成员变量A 3.1.1 ~B(); 3.1.2 ~A(); 3.2 ~A();
|