我对虚拟析构函数和虚函数表有一些具体问题。
假设我有以下代码:
class Base
{
public:
virtual ~Base();
};
class Child : public Base
{
public:
~Child();
};
问题:
- vtable存储在哪里?它是否始终位于基类中,并且所有子类都只保留指向它的指针?
- 添加虚方法只会增加 sizeof(class) 8 个字节,对吗? (假设64位系统)如果基类存储表呢?
- 通过 new 运算符创建 Child 类型的实例,然后删除...会调用 Base 析构函数吗? (我问是因为 Child 类的析构函数不是虚拟的......这是否意味着它只影响 Child 的子类?)。
下面的解释假设编译器使用的虚拟调度实现是基于虚拟表的。
每个具有虚拟方法(声明或继承)的类都有自己的虚拟表。如果子类重写了基类中的虚拟成员函数,则指向重写函数的指针将放置在该类的 vtable 中;否则,指向基类实现的指针将保留在适当的位置。
添加第一个虚函数会增加类的大小instance由vtable指针的大小决定。第一个之后的虚拟函数不会增加实例的大小。
Since ~Base
是虚拟的,则~Child
也是虚拟的,尽管virtual
关键字被省略。如果出现超控情况,virtual
关键字是可选的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)