带有实现的纯虚函数

新手上路,请多包涵

我的基本理解是没有纯虚函数的实现,但是,有人告诉我可能有纯虚函数的实现。

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

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

上面的代码可以吗?

使其成为具有实现的纯虚函数的目的是什么?

原文由 skydoor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 529
2 个回答

virtual 函数必须在将被直接实例化的派生类型中实现,但是基类型仍然可以定义实现。派生类可以通过使用全范围名称(在您的示例中调用 A::f() 如果 A::f()publicprotected )。就像是:

 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++ 程序员,甚至是有经验的程序员都感到惊讶)。

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 Mohamed El hadjaoui 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题