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

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

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

上面的代码可以吗?

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


当前回答

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

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

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

其他回答

纯虚函数必须在将被直接实例化的派生类型中实现,但是基类型仍然可以定义实现。派生类可以通过使用全作用域名称显式调用基类实现(如果访问权限允许的话)(在示例中调用A::f()—如果A::f()是公共的或受保护的)。喜欢的东西:

class B : public A {

    virtual void f() {
        // class B doesn't have anything special to do for f()
        //  so we'll call A's

        // note that A's declaration of f() would have to be public 
        //  or protected to avoid a compile time problem

        A::f();
    }

};

我能想到的用例是,当存在一个或多或少合理的默认行为,但类设计器希望只显式地调用这种默认行为时。也可能是这样,你希望派生类总是执行它们自己的工作,但也能够调用一组公共功能。

请注意,尽管语言允许这样做,但我并没有看到它被普遍使用(而且可以这样做的事实似乎让大多数c++程序员感到惊讶,甚至是有经验的程序员)。

使用带有实现主体的纯虚拟方法的一个重要用例是,当您想拥有一个抽象类,但该类中没有任何合适的方法使其成为纯虚拟时。在这种情况下,您可以将类的析构函数设为纯虚函数,并为此放置所需的实现(甚至是空体)。举个例子:

class Foo
{
   virtual ~Foo() = 0;
   void bar1() {}
   void bar2(int x) {}
   // other methods
};

Foo::~Foo()
{
}

这种技术使得Foo类是抽象的,因此不可能直接实例化该类。与此同时,您还没有添加一个额外的纯虚方法来使Foo类抽象。

如果我问你动物的声音是什么,正确的回答是问哪种动物,这正是纯虚函数或抽象函数的目的,当你不能在基类(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/

(链接中断,使用存档)