【发布时间】:2017-05-31 14:52:43
【问题描述】:
我有一些关于虚拟析构函数和 vtable 的具体问题。
假设我有以下代码:
class Base
{
public:
virtual ~Base();
};
class Child : public Base
{
public:
~Child();
};
问题:
- vtable 存储在哪里?它总是在基类中,所有子类都只是保持一个指向它的指针吗?
- 添加虚拟方法只会将 sizeof(class) 增加 8 个字节,对吗? (假设是64位系统)基类存储表呢?
- 通过 new 运算符创建 Child 类型的实例然后删除 ... 会调用 Base 析构函数吗? (我问是因为 Child 类的析构函数不是虚拟的……这是否意味着它只影响 Child 的子类?)。
【问题讨论】:
-
1 和 2: 实现定义。 3: 是的。
-
我假设您的意思是
Child实际上是Base的子类? -
1. (a) 每个类必须有自己的 vtable,否则该技术无法工作。 (b) 真的没有“在课堂上”这样的东西。 2.因此无关紧要。 3.子类的析构函数是如果基类是虚拟的。
-
如果基类析构函数是虚的,那么所有派生类的析构函数也是虚的——不管你写
virtual或override与否;这是可选的,但不会改变派生 dtor 是虚拟的事实。 -
@DeiDei -- 正式地,不是“定义的实现”,而是“具体的实现”。在语言定义中,“实现定义”意味着实现必须记录它所做的事情。
标签: c++ polymorphism vtable