継承における関数のオーバーロード: 隠し関数を理解する
オブジェクト指向プログラミングでは、継承によりクラスが親クラスからプロパティとメソッドを継承できます。ただし、基本クラスと派生クラスで同じ名前でシグネチャが異なる関数を定義すると、名前の検索があいまいになり、エラーが発生する可能性があります。
問題:
次のコード スニペット:
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: member function not found } };
派生クラス C 内でオーバーライドされた foo 関数を呼び出そうとすると、名前の検索が派生クラス B で停止し、基本クラス A から継承された foo を見つけることができないため、コンパイラでエラーが発生しました。
解決策:
この問題を解決するには、次のようにします。基本クラスの関数は、using キーワードを使用して派生クラスのスコープ内で明示的に宣言する必要があります。これにより、両方の関数が派生クラス内から見えるようになります。
class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; using A::foo; // Re-declare function from base class }; class C : public B { public: void bar() { string s; foo(s); // Now calls the inherited 'foo' function } };
説明:
継承における名前検索は階層的です。デフォルトでは、名前検索では派生クラスで定義された関数が優先されます。上記の例では、C で foo(s) が呼び出されるとき、コンパイラーは最初に C で一致する関数を探し、次に B で、最後に A で探します。ただし、B には独自の foo 関数があるため、検索はそこで停止します。
A::foo を使用して B で基本クラスの foo 関数を明示的に宣言することにより、コンパイラは名前の検索中に両方の関数を考慮するように指示されます。これにより、継承された foo 関数を見つけて C から呼び出すことができます。
本質的に、この手法は派生クラスに関数が隠蔽される問題を解決し、継承階層でオーバーロードされた関数を操作するときに正しい名前の検索を保証します。
>以上がC 継承で関数をオーバーロードする際の関数隠蔽の問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。