小编典典

带有实现的纯虚函数

all

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

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

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

上面的代码可以吗?

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


阅读 101

收藏
2022-07-02

共1个答案

小编典典

virtual函数必须在将被直接实例化的派生类型中实现,但是基类型仍然可以定义实现。派生类可以通过使用全范围名称(通过A::f()在您的示例中调用
- if A::f()were publicor )显式调用基类实现(如果访问权限允许protected)。就像是:

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

2022-07-02