8

パラメーター リストが異なる 2 つの同じ名前のメソッドを派生クラスに継承しようとしています。そのうちの 1 つは仮想であり、派生クラスでオーバーライドされます。もう 1 つは非仮想です。そうすると、派生クラス オブジェクトから基底クラスの非仮想メソッドにアクセスしようとすると、コンパイル エラーが発生します。

ここにコードスニペットがあります

class Base {
public: 
    void f() {
        cout << "[Base::f()]" << endl;
    }

    virtual void f(int arg) {
        cout << "[Base::f(" << arg << ")]" << endl;
    }
};


class Deriv : public Base {
public:
    virtual void f(int arg) {
        cout << "[Deriv::f(" << arg << ")]" << endl;
    }
};


int main() {
    Deriv d;
    d.f(-1);    
    d.f();  // <<-- compile error   
    return 0;
}

次のコンパイル エラーが発生します。

エラー: 'Deriv::f()' の呼び出しに一致する関数がありません<br /> 注: 候補は: virtual void Deriv::f(int)

私は C++ の専門家ではありませんが、これまでは、メンバー メソッドはシグネチャによって完全に区別できるという仮定が正しいと考えていました。したがって、非仮想メソッド Base::f() をオーバーライドしてはならず、アクセス可能なままにしておく必要があります。私はこれで間違っていますか?

これに関する興味深い/追加のコメントを次に示します。

    - オーバーライド メソッド Deriv::f(int arg) も非仮想である可能性があります。エラーはどちらの方法でも発生します
    -エラーは消えます/回避できます...
      ... Deriv オブジェクトを Base クラスにキャストすることにより ... Deriv で
      Base::f(int arg) をオーバーライドしない場合
      ... コマンド「Base::f;」を追加することにより Derivの公開部分へ

このコンパイル エラーを回避する方法は既に知っているので、主にこのエラーが発生する理由に関心があります。

4

2 に答える 2

10

Deriv、次を追加します。

using Base::f;

@DumbCoder によって提供されたリンクに加えて、同様の質問に対する私の回答で詳細を見つけることができます: Overriding a Base's Overloaded Function in C++

于 2010-08-04T14:31:16.117 に答える
2

派生クラス関数は、基本関数の定義を隠します。その理由と方法についての詳細な説明

于 2010-08-04T14:32:45.137 に答える