1. ホーム
  2. c++

[解決済み] 実装を伴う純粋な仮想関数

2022-05-07 12:26:04

質問

私の基本的な理解では、純粋仮想関数の実装はありませんが、純粋仮想関数の実装があるかもしれないと言われました。

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

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

上記のコードに問題はありませんか?

実装を伴う純粋な仮想関数にする目的は何でしょうか?

どのように解決するのですか?

純粋な virtual 関数は、直接インスタンス化される派生型に実装されなければなりませんが、基本型はまだ実装を定義することができます。派生クラスは、アクセス権が許す限り、完全にスコープされた名前を使って (例えば、"Second" と呼ばれる関数で) ベースクラスの実装を明示的に呼び出すことができます。 A::f() あなたの例では、もし A::f()public または 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++プログラマーを驚かせているようです)。