不会用于删除对象的基类的析构函数应该是虚拟的吗?
Should the destructor for a base class that you won't use to delete an object, be virtual?
>假设我有两个基类,
struct A {};
struct B {};
以及使用多重继承的派生版本
struct D : A, B {};
如果我的使用场景是这样的:
A *obj = new D;
即我永远不会使用 B
基类来引用派生对象,我是否必须使两个基的析构函数都虚拟?我目前正在声明B
的析构函数protected
禁止其他用户这样做,但这足够吗?
D
的析构函数呢?
只要B*
从未用于删除派生对象,B
的析构函数就不必是虚拟的。参见 [expr.delete]/3:
。如果要删除的对象的静态类型与其 动态类型,静态类型应是要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。
在这种情况下,"静态类型"是 T
cv 的类型,其中要delete
的操作数的类型为 T
cv *
。因此,您情况下的要求是强加给A
的,而不是B
。
相关文章:
- 子类地址等于虚拟基类地址?
- 虚拟基类函数中派生类的大小
- 虚拟基类初始化
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 返回纯虚拟基类的向量的元素
- std::is_base_of和虚拟基类
- 如何在子类中重写时调用私有虚拟基类实现
- 从两个不同类继承的非虚拟基类的访问成员
- 为什么必须由最派生的类构建虚拟基类
- 虚拟基类的派生类列表
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 虚拟基类和继承
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 在派生类中使用虚拟基类的受保护的CTOR
- 私有非虚拟基类函数被称为派生类中的函数
- 虚拟基类的创建顺序
- 使用虚拟基类C++向下转换
- 为什么在派生最多的类的初始值设定项列表中显式调用虚拟基类构造函数的规则,而较老的祖先已经拥有它?
- 虚拟与纯虚拟基类函数并从DLL导出
- 在多级继承中派生的虚拟基类会发生什么