我的基本理解是没有纯虚函数的实现,然而,我被告知可能有纯虚函数的实现。

class A {
public:
    virtual void f() = 0;
};

void A::f() {
    cout<<"Test"<<endl;
}

上面的代码可以吗?

让它成为一个带有实现的纯虚函数的目的是什么?


当前回答

它的优点是它强制派生类型仍然重写方法,但也提供了默认的或添加的实现。

其他回答

是的,这是正确的。在您的示例中,派生自A的类继承了接口f()和默认实现。但是你强迫派生类实现方法f()(即使它只是调用A提供的默认实现)。

Scott Meyers在Effective c++ (2nd Edition)第36项中讨论了这一点,区分接口的继承和实现的继承。项目编号可能在最新版本中发生了变化。

需要明确的是,你误解了什么= 0;后有虚函数的意思。

= 0表示派生类必须提供实现,而不是基类不能提供实现。

在实践中,当您将虚函数标记为纯(=0)时,提供定义几乎没有什么意义,因为它永远不会被调用,除非有人通过Base:: function(…)显式地这样做,或者如果基类构造函数调用了所讨论的虚函数。

如果我问你动物的声音是什么,正确的回答是问哪种动物,这正是纯虚函数或抽象函数的目的,当你不能在基类(animal)中提供函数的实现,但每个动物都有自己的声音。

class Animal
{
   public:
       virtual void sound() = 0;
}

class Dog : public Animal
{
   public:
       void sound()
       {
           std::cout << "Meo Meo";
       }
}

你必须给一个纯虚析构函数一个主体,例如:)

阅读:http://cplusplus.co.il/2009/08/22/pure-virtual-destructor/

(链接中断,使用存档)

它的优点是它强制派生类型仍然重写方法,但也提供了默认的或添加的实现。