C++ 没有虚拟函数,但仍然需要虚拟析构函数?

C++ 没有虚拟函数,但仍然需要虚拟析构函数?,c++,virtual-destructor,C++,Virtual Destructor,我编写了一个没有虚函数的基类和派生类。虚拟析构函数的使用通常是我看到的关于何时使用虚拟析构函数的指南 然而,虽然我的类没有虚拟函数,但当我传递这些类时,我以多态的方式使用它们。因此,类基类应该实现一个虚拟析构函数 class Base; class Derived; main() { base& baseVar = derived(); foo(baseVar); } 如果您的程序发现自己处于通过基类指针删除派生类实例的位置,则应该使用虚拟析构函数,以确保调用正确的析构函

我编写了一个没有虚函数的基类和派生类。虚拟析构函数的使用通常是我看到的关于何时使用虚拟析构函数的指南

然而,虽然我的类没有虚拟函数,但当我传递这些类时,我以多态的方式使用它们。因此,类基类应该实现一个虚拟析构函数

class Base;
class Derived;

main()
{
   base& baseVar = derived();
   foo(baseVar);
}

如果您的程序发现自己处于通过基类指针删除派生类实例的位置,则应该使用虚拟析构函数,以确保调用正确的析构函数


有关更多详细信息,请参见此问题

如果程序发现自己将通过基类指针删除派生类的实例,以确保调用正确的析构函数,则应使用虚拟析构函数


有关更多详细信息,请参见此问题。

没有多态性,因为您使用referemce调用(将调用)非虚拟函数。在您的示例中,您只需调用(将调用)基类的函数

此外,这项声明

base& baseVar = derived();
不应编译,因为您使用非常量引用绑定了临时对象

一定有

const base& baseVar = derived();
至于您示例中的析构函数,则不需要使用虚拟析构函数。因为您定义了对派生类的临时对象的引用。在这种情况下,临时对象将被称为其自己的析构函数。也就是说,首先调用基类的析构函数(从派生类的析构函数),然后执行派生类的析构函数体

如果要在堆中分配派生内存并将分配内存的地址分配给基类的指针,则需要使用vertual析构函数。当您为这个指针调用运算符delete时,如果您没有虚拟析构函数,那么只调用基类的析构函数

比如说

class Base;
class Derived;

main()
{
   base* baseVar = new derived();
   delete baseVar; // base shall have a virtual destructor
}

没有多态性,因为您使用referemce调用(将调用)非虚拟函数。在您的示例中,您只需调用(将调用)基类的函数

此外,这项声明

base& baseVar = derived();
不应编译,因为您使用非常量引用绑定了临时对象

一定有

const base& baseVar = derived();
至于您示例中的析构函数,则不需要使用虚拟析构函数。因为您定义了对派生类的临时对象的引用。在这种情况下,临时对象将被称为其自己的析构函数。也就是说,首先调用基类的析构函数(从派生类的析构函数),然后执行派生类的析构函数体

如果要在堆中分配派生内存并将分配内存的地址分配给基类的指针,则需要使用vertual析构函数。当您为这个指针调用运算符delete时,如果您没有虚拟析构函数,那么只调用基类的析构函数

比如说

class Base;
class Derived;

main()
{
   base* baseVar = new derived();
   delete baseVar; // base shall have a virtual destructor
}

仅当您要删除指向基类的指针时才使用虚拟析构函数。那是你唯一需要的时候。如果您不打算以这种方式删除,那么请保护基类的析构函数以防止错误。“虚拟的使用通常是指南”-这是一条有用的经验法则,但真正的指南是您是否需要多态销毁(例如通过指向基类的指针删除)。仅当要删除指向基类的指针时才使用虚拟析构函数。那是你唯一需要的时候。如果您不打算以这种方式删除,请保护基类的析构函数以防止错误。“虚拟的使用通常是指南”-这是一条有用的经验法则,但真正的指南是您是否需要多态性销毁(例如通过指向基类的指针删除)。“您可能最终…”但您可能不需要。这还不足以要求不能以多态方式使用的类具有虚拟析构函数。@juanchopanza好的,我将重新表述“您可能最终会…”,但您可能不会。这还不足以要求不能以多态方式使用的类具有虚拟析构函数。@juanchopanza好的,我将重新表述您演示的示例不需要多态销毁。但是,我不知道用户将如何使用我的类。你的例子说明了这一点。这让我相信我应该通过提供或保护它来积极处理它。我不确定我将如何做出这个决定,但我认为任何一种方法都是好的,因为您已经展示了我的示例不需要多态性破坏。但是,我不知道用户将如何使用我的类。你的例子说明了这一点。这让我相信我应该通过提供或保护它来积极处理它。我不确定我将如何做出这个决定,但我认为任何一种方式都可以