虚拟表中是否包含继承的析构函数?

时间:2017-07-20 09:07:38

标签: c++ inheritance vtable

如果我的编译器使用虚拟表,B的虚拟表怎么样? A::~A会在B的虚拟桌内吗?

struct A{
    virtual ~A()
    {
        cout<<"A::destructor"<<endl;
    }
};
struct B:public A{
    ~B()
    {
        cout<<"B::destructor"<<endl;
    }
};

1 个答案:

答案 0 :(得分:3)

不,它在~A的虚拟表格中没有B。它将在与析构函数对应的条目中具有~B。毕竟,一旦析构函数被声明为虚拟,所有派生的析构函数都是虚拟的。

因此delete表达式将始终调用正确的析构函数。 A的基础子对象B的销毁方式可以通过编译器静态~A的末尾注入~B来完成。 {1}}。从概念上讲是这样的:

~B()
{
    cout<<"B::destructor"<<endl;

    //User defined code ended. Compiler generated one is here
    static_cast<A*>(this)->A::~A();
}

这是深入研究可能的实现细节。这些都不属于C ++标准本身。