纯虚函数及其实现

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

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

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

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

上面的代码可以吗?

用实现来使它成为纯虚拟函数的目的是什么?

提问于
用户回答回答于

清纯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();
    }

};

我能想到的用例是,当有一个或多或少合理的默认行为时,类设计人员希望只显式地调用这种默认行为。它也可以是您希望派生类始终执行自己的工作的情况,但也可以调用一组通用的功能。

用户回答回答于

要明确的是,误解了什么是=0;在虚拟函数之后意味着。

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

实际上,当将一个虚拟函数标记为纯函数(=0)时,提供一个定义没有什么意义,因为除非有人通过Base::Function(...)或基类构造函数调用所述的虚拟函数显式地调用它,否则它将永远不会被调用。

扫码关注云+社区