C++基类、派生类的初始化
class base {
// ...
}
class derived : public base {
// ...
}
/
derived A;
执行derived A
时, 推测 基类和派生类的构造顺序如下:
- 在编译时分别确定好base及derived中vtbl(虚函数表)中的vptr(虚函数表指针)指向;
- 执行base类中的构造函数,此时derived没有生成,base中仍使用编译时base生成的vtbl;
- 执行derived类的构造函数,derived中使用编译时生成的derived中的vtbl,base生成的vtbl不再使用;
- 派生类初始化完成。
在base类初始化过程中,并没有derived类的信息,所以只能用自己scope中的虚函数来执行类的构造函数。由此也可以解释Effective C++中Item9(Never call virtual functions during construction or destruction)中的情况了,同时Item 9中也指出:
During base class construction, virtual functions never go down into derived classes. Instead, the object behaves as if it were of the base type.
在析构时情况也类似。