如果派生中没有数据成员,C++仍然需要Virtual析构函数吗?

snk*_*snk 12 c++ virtual-destructor

假设我有这个代码

class Base{
  public:
        int getVal();
  private:
         int a, b;
};

class Derived::public Base{
    public:
         void printVal();
};

int main(){
    Base *b = new Derived();
    delete b;    
}
Run Code Online (Sandbox Code Playgroud)

我知道虚拟析构函数会正确删除内容,但是使用基指针(没有虚拟析构函数)删除是不好的,即使派生类中没有虚函数也没有数据成员?如果这样做会发生什么?

Jam*_*lis 9

即使在派生类中没有虚函数且没有数据成员,使用基指针删除(没有虚拟析构函数)是不是很糟糕?

是.

无论派生类的内容如何,​​行为都是未定义的.

如果这样做会发生什么?

什么事情都可能发生.

  • 为"任何可能发生的事情"+1.什么!绝对没有!:) (3认同)

Dav*_*nco 7

对于原始类型的数据,您的示例很可能在实践中起作用.事实上,产生vtable实际上可能会阻碍性能(因此这里可能有一些合法用途),但从技术上来说,它 5.3-5.4:

如果[删除运算符]的操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

它真的全部取决于你的类中数据的"堆积",并且由于没有堆分配的成员(在你的情况下),你应该没问题,但它肯定是代码味道.

  • 依靠"最有可能"的事情并假设你"应该没事"是危险的.编写_will_工作的代码要好得多,然后你知道你会没事的. (3认同)