在C ++中将主体添加到纯虚拟/抽象函数中?

时间:2013-11-23 08:18:02

标签: c++ virtual abstract

纯虚函数不应该有正文,但我注意到编译器接受以下代码:

class foo
{
    virtual void dummy() = 0
    {
        cout << "hello";
    }
};

那么,为什么允许纯虚函数拥有一个体?此外,即使函数有一个正文,该类仍然无法实例化,为什么会这样?

2 个答案:

答案 0 :(得分:5)

纯虚函数可以有一个正文,但是你将它们声明为纯虚拟这一事实恰恰就是说派生的实现必需

您可以从派生方法(使用显式BaseClass::method())执行纯虚方法,但仍然必须提供实现。

无法使用尚未覆盖的纯虚方法实例化类是纯虚拟声明的要点。换句话说,声明纯虚方法的想法是确保程序员不会忘记提供其实现的

答案 1 :(得分:3)

一般来说,抽象类用于定义接口和/或部分实现,并且旨在由具体类继承。这是一种在该类的设计器用户之间强制执行contract的方法,无论它们是什么。

如果您不需要此合同并希望实例化,则不要将其强制为抽象类,即删除= 0

如果您关心的是为什么纯虚函数首先具有正文,那么一个很好的例子就可以从Scott Meyers的 Effective C ++ 一书中引用:

  

实现此纯虚函数的派生类可以调用   这个实现在他们的代码中的某处。如果部分代码   两个不同的派生类是相似的,然后移动是有意义的   它在层次结构中,即使该函数应该是纯虚拟的。

另一个例子是纯虚拟析构函数(顺便说一下它也是一个函数):

...

virtual ~foo() = 0;

...

foo::~foo() {} // required!

当您必需为其提供实现时,但同时又希望将其设为纯虚拟,以使foo类成为抽象。所以,事实上,语言本身的核心依赖于这一特性。