派生クラスの継承における関数名の衝突
次のコード スニペットを考慮してください:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {} }; class C : public B { public: void bar() { string s; foo(s); } };
このコードをコンパイルするとき、コンパイラは以下を生成しますerror:
error: no matching function for call to 'C::foo(std::string&)' candidates are: int B::foo(int)
このエラーは、関数名のシャドウイングが原因で発生します。派生クラス B が基本クラス A の関数と同じ名前の関数を定義すると、派生クラス関数は基本クラス関数をシャドウします。
Name Lookup Scope
クラス スコープでの名前の検索は次の手順に従います。
解決策
関数名の衝突を解決するには、派生クラスのスコープ内で基本クラス関数を再宣言できます。これにより、両方の関数が派生クラスとその子孫内で確実に表示されるようになります:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {}; using A::foo; }; class C : public B { public: void bar() { string s; foo(s); } };
using A::foo; を追加することで、基本クラス A の foo 関数が派生クラスでも使用できることを指定します。クラス B。これで、コードはエラーなしでコンパイルされます。
追加注
"次の手順では、クラス スコープでの名前検索の結果を定義します (C.まず、クラスおよびその基本クラスの各サブオブジェクト内の名前のすべての宣言が、1 つのサブオブジェクト B 内のメンバー名 f を a 内のメンバー名 f を非表示にすることが考慮されます。 A が B の基本クラスのサブオブジェクトである場合、サブオブジェクト A。
以上がC の派生クラスの継承における関数名の衝突を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。