ホームページ  >  記事  >  バックエンド開発  >  多態性メソッドを呼び出すときに型が重複する多重継承のあいまいさを解決するにはどうすればよいですか?

多態性メソッドを呼び出すときに型が重複する多重継承のあいまいさを解決するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 06:23:02254ブラウズ

How to Resolve Ambiguity in Multiple Inheritance with Overlapping Types When Calling Polymorphic Methods?

型が重複する多重継承における曖昧さ回避

異なる基本クラスに重複しないセットがある場合、多重継承により曖昧なクラス メンバー呼び出しが発生する可能性があります。多態性メソッドに適用可能な型のリスト。可変長基底クラス テンプレート Base がメソッド foo() を定義するシナリオを考えてみましょう。このメソッドは、その型パラメータ パックに含まれるテンプレート パラメータでのみ呼び出すことができます。

この例では:

<code class="cpp">template <typename ... Types>
class Base {
public:
    template <typename T>
    typename std::enable_if<Contains<T, Types ...>::value>::type
    foo() {
        std::cout << "Base::foo()\n";
    }
};

重複しない型セットを使用して Base から 2 回継承するクラス Derived を派生できます:

<code class="cpp">struct Derived: public Base<int, char>,
                public Base<double, void>
{};</code>

Derived().foo() を呼び出すと、コンパイラーは解決できませんどの基本クラスから foo() を呼び出すか、曖昧な呼び出しエラーが発生します。

コンパイラがあいまいさを解決できない理由

クラスのマージ ルール-member lookup は、派生クラス (この場合は Derived) の宣言セットが空の場合、メンバー (この場合は foo) のルックアップ セットがすべての直接基本クラスからマージされることを示します。ただし、基底クラスには foo の異なる宣言セットがあるため、マージは曖昧です。

回避策

曖昧さを解決するには、Derived の宣言セットを作成します。基底に foo メソッドの using 宣言を追加することで空ではなくなります:

<code class="cpp">struct Derived: public Base<int, char>,
                public Base<double, void>
{
    using Base<int, char>::foo;
    using Base<double, void>::foo;
};</code>

Using 宣言により、基底クラスから派生クラスにメンバーが取り込まれ、foo の 2 つのオーバーロードを効果的に Derived に提供します。コンパイラは、適切なオーバーロードを明確に呼び出すことができます。

代替ソリューション

  • ベース コレクター クラス: このクラス テンプレートは、宣言を使用して収集できます。
  • C 17 でのパック展開: パック展開を使用すると、BaseCollector テンプレートを 1 行に簡素化し、より簡潔かつ効率的にすることができます。コンパイルします。

以上が多態性メソッドを呼び出すときに型が重複する多重継承のあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。