我有一个关于虚拟析构函数的问题。我知道如果变量指针是多态的,则必须创建一个虚拟析构函数,但是如果我不需要执行任何特定于破坏的代码,是否有必要吗?

例如,以下代码:

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,“其动态类型”为BarDataBooData。因此它们是不同的,并且静态类型ExtraData必须具有虚拟析构函数。

07-24 14:27