没有虚函数,但还需要虚拟析构函数吗?

时间:2014-03-08 13:12:57

标签: c++ virtual-destructor

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

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

class Base;
class Derived;

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

2 个答案:

答案 0 :(得分:2)

如果程序发现它将通过基类指针删除派生类的实例以确保调用正确的析构函数,那么你应该使用虚拟析构函数。

有关详细信息When to use virtual destructors?

,请参阅此问题

答案 1 :(得分:2)

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

此外这句话

base& baseVar = derived();
不应编译

,因为您使用非const引用绑定临时对象。

必须有

const base& baseVar = derived();

对于示例中的析构函数,则不需要虚拟析构函数。因此,您定义了对派生类的临时对象的引用。在这种情况下,临时对象将被称为自己的析构函数。首先,将调用基类的析构函数(从派生类的析构函数中),然后执行派生类的析构函数体。

如果要在堆中分配派生内存并将分配的内存的地址分配给基类的指针,则需要使用vertual析构函数。当你为这个指针调用operator delete时,如果你没有虚析构函数,那么就会调用基类的唯一析构函数。

例如

class Base;
class Derived;

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