【问题标题】:Why is not the destructor of a virtual class automatically added to the vtable?为什么虚拟类的析构函数没有自动添加到 vtable 中?
【发布时间】:2018-09-24 18:33:13
【问题描述】:

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

edit:意识到如果不将 A 的析构函数设为虚拟,B 的析构函数甚至不在 vtable 中,因此在调用 A 的析构函数时它只是直接调用 A 的析构函数。我的问题没有意义。

【问题讨论】:

  • 因为这是语言标准所说的应该发生的事情。而 C++ 的工作原则是“不用为不用的东西付费”。

标签: c++ polymorphism virtual destructor vtable


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2010-12-11
    • 2015-11-12
    • 2012-04-13
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2021-03-20
    • 2011-02-04
    相关资源
    最近更新 更多