具有未覆盖的纯虚拟析构函数的类是否应该可以初始化?

时间:2014-08-31 13:23:35

标签: c++ c++11 abstract-class destructor pure-virtual

Common wisdom是你可以通过拥有纯虚析构函数来使类抽象化。

引用Herb Sutter

  

所有基类都应该有一个虚拟析构函数(由于这个原因,请参阅您最喜欢的C ++书)。如果类应该是抽象的(你想要阻止实例化它),但它没有碰巧有任何其他纯虚函数,这是使析构函数纯虚拟的常用技术:

但是,以下代码使用GCCVC为我编译:

#include <iostream>

struct base {
    virtual ~base() = 0;
};

base::~base() { std::cout << "base destructor\n"; }

struct derived : base { };

int main() {
    derived d;
}

我不知道C ++ 11中有什么变化吗?

顺便说一句,这个问题的动机是answer I gave five years ago,并且突然被commenter挑战。

1 个答案:

答案 0 :(得分:2)

derived类有一个隐式定义的(编译器提供的)虚拟析构函数,它不是纯粹的,它会覆盖基础析构函数。因此derived不是抽象类。它可以实例化。

这与C ++ 11无关。这就是自C ++ 98以来一直如此。使基类析构函数纯虚拟是一种方法,只有那个类抽象。派生类中编译器提供的析构函数将是非纯虚拟的,它将自动&#34;取消&#34;这些类中的抽象性(假设没有其他纯虚方法从基类继承)。