是否应该初始化具有未重写的纯虚拟析构函数的类

Should a class with an un-overridden pure virtual destructor be initializable?

本文关键字:虚拟 析构函数 重写 初始化 是否      更新时间:2023-10-16

常见的观点是,如果您可以通过使用纯虚拟析构函数来使类抽象化。

引用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以来,它一直都是这样。使基类析构函数成为纯虚拟的是一种使该类并且仅使该类成为抽象类的方法。编译器在派生类中提供的析构函数将是非纯虚拟的,这将自动"抵消"这些类中的抽象性(假设没有从基继承其他纯虚拟方法)。