代码之家  ›  专栏  ›  技术社区  ›  geranimo

为什么虚拟类的析构函数不能自动添加到vtable中?

  •  1
  • geranimo  · 技术社区  · 6 年前

    当虚拟类B派生自虚拟基类a时,除非在a和B中显式声明虚拟析构函数,否则vtable中B的析构函数将指向a的析构函数。为什么?为什么B的vtable析构函数不自动指向B的析构函数,而不必定义A和B虚拟析构函数?

    编辑:意识到如果不将A的析构函数设为虚拟,B的析构函数甚至不在vtable中,所以当调用A的析构函数时,它只会直接调用A的析构函数。我的问题没有意义。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Sebastian Redl    6 年前

    C++的工作原理是“不用的东西不用付费”。强制具有任何虚拟函数的任何类的析构函数为虚拟的,即使该类的客户端从未以多态方式(即通过基指针)删除该类的对象,也是一种非零成本(vtable中的插槽,删除需要虚拟函数调用的对象)。因此,如果没有显式指令,C++就无法做到这一点。