是否应该初始化具有未重写的纯虚拟析构函数的类
Should a class with an un-overridden pure virtual destructor be initializable?
常见的观点是,如果您可以通过使用纯虚拟析构函数来使类抽象化。
引用Herb Sutter的话:
所有基类都应该有一个虚拟析构函数(原因请参阅您最喜欢的C++书)。如果类应该是抽象的(你想防止实例化它),但它没有任何其他纯虚拟函数,那么使析构函数成为纯虚拟函数的一种常见技术是:
然而,以下代码为我编译GCC和VC:
#include <iostream>
struct base {
virtual ~base() = 0;
};
base::~base() { std::cout << "base destructorn"; }
struct derived : base { };
int main() {
derived d;
}
C++11中是否发生了我不知道的变化?
顺便说一句,这个问题的动机是我五年前给出的答案,突然被一位评论者质疑。
derived
类有一个隐式定义的(编译器提供的)虚拟析构函数,它不是纯的,并且覆盖基析构函数。因此,derived
不是一个抽象类。它可以实例化。
这与C++11无关。自从C++98以来,它一直都是这样。使基类析构函数成为纯虚拟的是一种使该类并且仅使该类成为抽象类的方法。编译器在派生类中提供的析构函数将是非纯虚拟的,这将自动"抵消"这些类中的抽象性(假设没有从基继承其他纯虚拟方法)。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数