没有虚拟功能,但仍然需要虚拟破坏者
No virtual functions, but still need virtual destructor?
我写了一个没有虚拟函数的基础和派生的类。虚拟的使用通常是我看到的指南,以便何时使用虚拟破坏者。
但是,虽然我的课程没有虚拟功能,但是当我将它们传递时,我正在以多态性的方式使用这些类。因此,班级基础应该实现虚拟灾难?
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
}
如果您的程序将自己处于删除通过基类指针派生类实例的位置,则应使用虚拟驱动器。
请参阅此问题以获取更多详细信息何时使用虚拟破坏者?
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么我的虚拟破坏者多次执行这些执行
- 纯抽象类的虚拟破坏者
- 与虚拟破坏者相比,Shared_PTR的运行时开销用于子类破坏
- 虚拟破坏者与普通破坏者
- 删除具有非虚拟破坏者的对象将引起
- 在C 中,是否有一种(新的)方法来测试类是否在模板中具有虚拟破坏者而无需实例化实例
- 没有虚拟功能,但仍然需要虚拟破坏者
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- 获取虚拟破坏者的重新定义错误
- 非造晶和非抽象基类中的虚拟破坏者
- 如何在Xcode中导出虚拟破坏者
- 虚拟破坏者:不工作