没有虚拟功能,但仍然需要虚拟破坏者

No virtual functions, but still need virtual destructor?

本文关键字:虚拟 破坏者 功能      更新时间:2023-10-16

我写了一个没有虚拟函数的基础和派生的类。虚拟的使用通常是我看到的指南,以便何时使用虚拟破坏者。

但是,虽然我的课程没有虚拟功能,但是当我将它们传递时,我正在以多态性的方式使用这些类。因此,班级基础应该实现虚拟灾难?

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

没有多态性,因为您使用参考文献调用(会调用)非虚拟函数。在您的示例中,您只需调用基类的功能。

此外,此语句

base& baseVar = derived();

不应该编译,因为您将临时对象绑定为具有非const参考的临时对象。

必须有

const base& baseVar = derived();

至于示例中的破坏者,则无需具有虚拟驱动器。因为您定义了对派生类的临时对象的引用。在这种情况下,临时对象将被称为其自己的破坏者。最初,将调用基类的破坏者(来自派生类的攻击者),然后将执行派生类的攻击函数的主体。

如果您要在堆中分配派生的内存并将分配的内存的地址分配给基类的指针,则需要垂直驱动器。当您调用此指针删除操作员时,如果您没有虚拟驱动器,则将调用基类的唯一损坏器。

例如

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

如果您的程序将自己处于删除通过基类指针派生类实例的位置,则应使用虚拟驱动器。

请参阅此问题以获取更多详细信息何时使用虚拟破坏者?