纯虚函数不应该有正文,但我注意到编译器接受以下代码:
class foo
{
virtual void dummy() = 0
{
cout << "hello";
}
};
那么,为什么允许纯虚函数拥有一个体?此外,即使函数有一个正文,该类仍然无法实例化,为什么会这样?
答案 0 :(得分:5)
纯虚函数可以有一个正文,但是你将它们声明为纯虚拟这一事实恰恰就是说派生的实现必需。
您可以从派生方法(使用显式BaseClass::method()
)执行纯虚方法,但仍然必须提供实现。
无法使用尚未覆盖的纯虚方法实例化类是纯虚拟声明的要点。换句话说,声明纯虚方法的想法是确保程序员不会忘记提供其实现的。
答案 1 :(得分:3)
一般来说,抽象类用于定义接口和/或部分实现,并且旨在由具体类继承。这是一种在该类的设计器和用户之间强制执行contract的方法,无论它们是什么。
如果您不需要此合同并希望实例化,则不要将其强制为抽象类,即删除= 0
。
如果您关心的是为什么纯虚函数首先具有正文,那么一个很好的例子就可以从Scott Meyers的 Effective C ++ 一书中引用:
实现此纯虚函数的派生类可以调用 这个实现在他们的代码中的某处。如果部分代码 两个不同的派生类是相似的,然后移动是有意义的 它在层次结构中,即使该函数应该是纯虚拟的。
另一个例子是纯虚拟析构函数(顺便说一下它也是一个函数):
...
virtual ~foo() = 0;
...
foo::~foo() {} // required!
当您必需为其提供实现时,但同时又希望将其设为纯虚拟,以使foo
类成为抽象。所以,事实上,语言本身的核心依赖于这一特性。