如果我的编译器使用虚拟表,B的虚拟表怎么样? A::~A
会在B
的虚拟桌内吗?
struct A{
virtual ~A()
{
cout<<"A::destructor"<<endl;
}
};
struct B:public A{
~B()
{
cout<<"B::destructor"<<endl;
}
};
答案 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 ++标准本身。