C++ 虚拟析构函数和 vtable

Cha*_*mon 4 c++ polymorphism vtable

我对虚拟析构函数和虚函数表有一些具体问题。

假设我有以下代码:

class Base
{
public:

    virtual ~Base();

};

class Child : public Base
{
public:

    ~Child();
};
Run Code Online (Sandbox Code Playgroud)

问题:

  1. vtable存储在哪里?它是否始终位于基类中,并且所有子类都只保留指向它的指针?
  2. 添加虚方法只会增加 sizeof(class) 8 个字节,对吗?(假设64位系统)如果基类存储表呢?
  3. 通过 new 运算符创建 Child 类型的实例,然后删除...会调用 Base 析构函数吗?(我问是因为 Child 类的析构函数不是虚拟的......这是否意味着它只影响 Child 的子类?)。

das*_*ght 6

下面的解释假设编译器使用的虚拟调度实现是基于虚拟表的。

  1. 每个具有虚拟方法(声明或继承)的类都有自己的虚拟表。如果子类重写了基类中的虚拟成员函数,则指向重写函数的指针将放置在该类的 vtable 中;否则,指向基类实现的指针将保留在适当的位置。

  2. 添加第一个虚函数会按 vtable 指针的大小增加类实例的大小。第一个之后的虚拟函数不会增加实例的大小。

  3. 由于~Base是虚拟的,因此~Child即使virtual省略关键字,也是虚拟的。在覆盖的情况下,virtual关键字是可选的。

  • @JacekCz 从 OP 写的其他内容中可以清楚地看出,他忘记在“Child”中添加“: public Base”。 (2认同)