编译器如何在继承中进行组合?
假设我创建了一个派生类的对象,其中基类和派生类都包含其他类的组合对象。我想用一些例子来解释构造函数和析构函数。
答案 0 :(得分:1)
我不会让你过于轻松,因为它确实看起来像家庭作业。如果你能够思考并理解下面的内容 - 祝你好运....
调用基类的构造函数,对于基类中声明的每个成员变量,它将调用与基类初始化列表中指定的参数对应的构造函数或默认构造函数(如果有) (否则该成员未被初始化,但有时例如,对象所包含的内存的早期零初始化 - 可能由于new (p) T()
符号或static
- 将保证特定值无论如何) 。然后,派生的构造函数对其自己的数据成员执行相同的操作。破坏以相反的顺序发生。
答案 1 :(得分:0)
如果您需要演示基本原则,可以使用以下的一些变体:
struct M { // Marker
int id;
M(int i) : id(i) { cout << "\tconstruction M" <<id<< endl; }
~M() { cout << "\tdestruction M" <<id<< endl; }
};
struct B { //Base
M mb;
B() : mb(1) { cout << "construction B (body finished)" << endl; }
~B() { cout << "destruction B (body finished)" << endl; }
};
struct D : public B { //Derived
M md;
D() : md(2) { cout << "construction D (body finished)" << endl; }
~D() { cout << "destruction D (body finished)" << endl; }
};
当然,它是简化的,但它表明基础是在派生之前构造的,并且成员是在构造执行body之前构造的。它表明,破坏是按照相反的顺序进行的。
但这只是最明显的。您还应该展示示例,演示在有多个时构造成员的顺序,以及多继承中发生的情况,以及静态成员的情况。