析构函数:是否为虚拟
Destructor: virtual or not?
我使用的是这样的多重继承:
struct A {
virtual ~A(){}
};
struct B {
virtual void foo() = 0;
protected:
~B(){} // never called directly
};
struct C : public A, public B {
virtual void foo(){};
};
B
的析构函数是否应该成为虚拟的?一方面,所有其他的析构函数都是虚拟的。另一方面,虚拟构造函数可能会涉及一些成本,所以为什么不保存这些成本呢?
重击的一个好规则是使析构函数成为虚拟的,直到找到不应该是虚拟的充分理由。这将帮助您避免未来的错误,如果在未来,您发现自己的性能因此受到了很大的影响,那么您可以轻松地将其删除。
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 重载虚拟行为是否定义良好?
- 是否可以在C++中使用虚拟类型?
- 虚拟继承中是否存在多重继承?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 是否有任何模式等效于虚拟模板功能?
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 非虚拟成员函数是否可以使用模板参数?
- 是否可以创建虚拟迭代器类?
- 是否有 lint 工具可以检查子类虚拟函数是否与父类定义匹配?
- 虚拟 CTOR 的克隆函数实现是否有问题
- 基类能否知道派生类是否已重写虚拟方法
- 给定这两种类型,我是否可以确定虚拟函数是否已被覆盖?