我有一个关于虚拟析构函数的问题。我知道如果变量指针是多态的,则必须创建一个虚拟析构函数,但是如果我不需要执行任何特定于破坏的代码,是否有必要吗?
例如,以下代码:
struct Foo
{
struct ExtraData
{
int myType;
}
struct BarData : public ExtraData
{
std::string myName;
float myFoo;
}
struct BooData : public ExtraData
{
int myBoo;
double myTime;
}
Foo() {}
~Foo() { delete myExtradata; }
int myA;
int myB;
ExtraData* myExtraData;
};
myExtraData是从结构外部创建的,可以通过新的BarData()或新的BooData()来创建。 BarData和BooData是否需要虚拟析构函数。还是因为他们没有成员指针,这可以吗?
最佳答案
打电话给UB:
Base* base = new Derived;
delete base; // UB here if ~Base is not virtual.
除非Base
的析构函数是virtual
。在您的情况下,“操作数的静态类型”为
ExtraData
,“其动态类型”为BarData
或BooData
。因此它们是不同的,并且静态类型ExtraData
必须具有虚拟析构函数。