多重継承では、派生クラスでの関数のオーバーロードにより、シグネチャが同じかどうかに応じて、基本クラスの関数が非表示になるかオーバーライドされます。ダイヤモンド継承構造では、派生クラスがどの基本クラス関数を呼び出すべきかわからないため、あいまいさが生じる可能性があります。あいまいさは、明示的なスコープ リゾルバー、型変換、または仮想継承を使用して解決できます。
C の多重継承により、派生クラスが複数の基本クラスから継承できるようになります。基本クラスと同じ名前の関数を定義することは、関数のオーバーロードと呼ばれます。オーバーロードされた関数は、多重継承において特定の効果をもたらします。
派生クラスが基本クラス内の関数を再定義する場合、関数を非表示にしたりオーバーライドしたりできます。派生クラス関数のシグネチャが基本クラス関数と同じである場合、その関数はオーバーライドされます。派生クラス関数のシグネチャが異なる場合、基本クラス関数は非表示になります。
class Base1 { public: void print() { cout << "Base1" << endl; } }; class Base2 { public: void print(int x) { cout << "Base2 " << x << endl; } }; class Derived : public Base1, public Base2 { public: void print() { cout << "Derived" << endl; } // 覆盖 Base1::print() }; int main() { Derived d; d.print(); // 输出 "Derived" d.print(5); // 输出 "Base2 5" }
多重継承により、クラスが同じ基本クラスを複数回継承するダイアモンド継承構造が形成されることがあります。この状況では、派生クラスはどの基本クラス関数を呼び出すべきかわからないため、関数のオーバーロードに曖昧さが生じます。
class Base { public: void print() { cout << "Base" << endl; } }; class Derived1 : public Base { public: void print() { cout << "Derived1" << endl; } // 覆盖 Base::print() }; class Derived2 : public Base { public: void print() { cout << "Derived2" << endl; } // 覆盖 Base::print() }; class GrandChild : public Derived1, public Derived2 { public: void print() { } // 编译错误:歧义,不知道调用 Derived1::print() 还是 Derived2::print() };
多重継承における関数のオーバーロードのあいまいさを解決するには、次のメソッドを使用できます。
Base::functionName
を使用して、呼び出される基本クラス関数を明示的に指定します。 virtual
キーワードを使用して、仮想継承を作成します。これにより、基本クラス関数が派生クラスで呼び出されるときに、基本クラスのバージョンではなく、実際の派生クラス インスタンスのバージョンが呼び出されることになります。 以上が多重継承における C++ 関数のオーバーロードの影響は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。