Common wisdom是你可以通过拥有纯虚析构函数来使类抽象化。
引用Herb Sutter:
所有基类都应该有一个虚拟析构函数(由于这个原因,请参阅您最喜欢的C ++书)。如果类应该是抽象的(你想要阻止实例化它),但它没有碰巧有任何其他纯虚函数,这是使析构函数纯虚拟的常用技术:
#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挑战。
答案 0 :(得分:2)
derived
类有一个隐式定义的(编译器提供的)虚拟析构函数,它不是纯粹的,它会覆盖基础析构函数。因此derived
不是抽象类。它可以实例化。
这与C ++ 11无关。这就是自C ++ 98以来一直如此。使基类析构函数纯虚拟是一种方法,只有那个类抽象。派生类中编译器提供的析构函数将是非纯虚拟的,它将自动&#34;取消&#34;这些类中的抽象性(假设没有其他纯虚方法从基类继承)。