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



纯虚拟函数不应该有主体,但我刚刚注意到编译器接受了以下代码:

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

那么,为什么允许纯虚拟函数具有实体呢?此外,即使函数有一个主体,类仍然不能实例化,为什么?

纯虚拟函数可以有一个主体,但您将它们声明为纯虚拟的事实恰恰意味着需要派生实现

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

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

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

如果您不需要这个契约并且想要实例化,那么不要强制它是抽象类,即删除= 0

如果你关心的是为什么纯虚拟函数首先会有body,那么一个很好的例子可能是引用Scott Meyers的Effective C++书中的这句话:

实现此纯虚拟函数的派生类可以调用这个实现在他们的代码中的某个地方。如果的部分代码两个不同的派生类是相似的,那么移动是有意义的即使函数应该是纯虚拟的。

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

...
virtual ~foo() = 0;
...
foo::~foo() {} // required!

需要为其提供实现,但同时希望使其纯虚拟以使foo类抽象时。因此,事实上,语言本身的核心依赖于这一特性。

最新更新