【发布时间】:2014-10-24 21:20:22
【问题描述】:
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的挑战。
【问题讨论】:
-
为什么不能编译?您正在实例化派生对象,而不是基础对象。而且只有你的基类是抽象的,因为你的派生类有默认的析构函数。
-
by having a pure virtual constructor=>by having a pure virtual destructor? -
@Gluttton 哎呀,谢谢。
-
@Motti:由于 C++98 的析构函数一直被隐式声明为非纯成员(在没有用户声明的情况下)。
-
纯虚析构函数的目的不是为了让上面的代码不合法。就是让这段代码非法:
base b;
标签: c++ c++11 abstract-class destructor pure-virtual