gpt4 book ai didi

C++ 虚拟析构函数和 vtable

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:05 27 4
gpt4 key购买 nike

我有一些关于虚拟析构函数和 vtable 的具体问题。

假设我有以下代码:

class Base
{
public:

virtual ~Base();

};

class Child : public Base
{
public:

~Child();
};

问题:

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

最佳答案

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

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

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

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

关于C++ 虚拟析构函数和 vtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com