パラメーター リストが異なる 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の公開部分へ
このコンパイル エラーを回避する方法は既に知っているので、主にこのエラーが発生する理由に関心があります。