1. 继承中的对象模型
在C++编译器的内部可以理解为结构体,子类是由父类成员叠加子类新成员而成:
class Aclass{ public: int mA; int mB; }; class Bclass : public Aclass{ public: int mC; }; class Cclass : public Bclass{ public: int mD; }; void test(){ cout << "A size:" << sizeof(Aclass) << endl; cout << "B size:" << sizeof(Bclass) << endl; cout << "C size:" << sizeof(Cclass) << endl; }
2. 对象构造和析构的调用原则
继承中的构造和析构
- 子类对象在创建时会首先调用父类的构造函数
- 父类构造函数执行完毕后,才会调用子类的构造函数
- 当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数
- 析构函数调用顺序和构造函数相反
class A{ public: A(){ cout << "A类构造函数!" << endl; } ~A(){ cout << "A类析构函数!" << endl; } }; class B : public A{ public: B(){ cout << "B类构造函数!" << endl; } ~B(){ cout << "B类析构函数!" << endl; } }; class C : public B{ public: C(){ cout << "C类构造函数!" << endl; } ~C(){ cout << "C类析构函数!" << endl; } }; void test(){ C c; }
继承与组合混搭的构造和析构
class D{ public: D(){ cout << "D类构造函数!" << endl; } ~D(){ cout << "D类析构函数!" << endl; } }; class A{ public: A(){ cout << "A类构造函数!" << endl; } ~A(){ cout << "A类析构函数!" << endl; } }; class B : public A{ public: B(){ cout << "B类构造函数!" << endl; } ~B(){ cout << "B类析构函数!" << endl; } }; class C : public B{ public: C(){ cout << "C类构造函数!" << endl; } ~C(){ cout << "C类析构函数!" << endl; } public: D c; }; void test(){ C c; }