C++基类、派生类的初始化

本文详细解析了C++中基类与派生类的构造顺序,以及虚函数表如何在构造过程中发挥作用。强调了在基类构造时无法访问派生类信息的特点,并引用Effective C++中的建议说明为何不应在构造函数中调用虚函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++基类、派生类的初始化

class base {
// ...
}

class derived : public base {
// ...
}

/
derived A;

执行derived A时, 推测 基类和派生类的构造顺序如下:

  1. 在编译时分别确定好base及derived中vtbl(虚函数表)中的vptr(虚函数表指针)指向;
  2. 执行base类中的构造函数,此时derived没有生成,base中仍使用编译时base生成的vtbl;
  3. 执行derived类的构造函数,derived中使用编译时生成的derived中的vtbl,base生成的vtbl不再使用;
  4. 派生类初始化完成。

在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.

在析构时情况也类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值