Heim > Backend-Entwicklung > C++ > Hauptteil

Wie löst man Mehrdeutigkeiten bei der Mehrfachvererbung mit überlappenden Typen beim Aufruf polymorpher Methoden?

Linda Hamilton
Freigeben: 2024-10-25 06:23:02
Original
253 Leute haben es durchsucht

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

Begriffsklärung bei Mehrfachvererbung mit überlappenden Typen

Mehrfachvererbung kann zu mehrdeutigen Aufrufen von Klassenmitgliedern führen, wenn verschiedene Basisklassen nicht überlappende Mengen haben der anwendbaren Typen für polymorphe Methoden. Stellen Sie sich das Szenario vor, in dem eine variable Basisklassenvorlage, Base, eine Methode, foo(), definiert, die nur mit Vorlagenparametern aufgerufen werden kann, die in ihrem Typparameterpaket enthalten sind.

In unserem Beispiel:

<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";
    }
};
Nach dem Login kopieren

Wir können eine Klasse, Derived, ableiten, die zweimal von Base mit nicht überlappenden Typsätzen erbt:

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

Beim Aufruf von Derived().foo() kann der Compiler keine Auflösung durchführen Von welcher Basisklasse aus foo() aufgerufen werden soll, was zu einem mehrdeutigen Aufruffehler führt.

Warum der Compiler die Mehrdeutigkeit nicht auflösen kann

Die Zusammenführungsregeln für die Klasse -Member-Lookup gibt an, dass, wenn der Deklarationssatz der abgeleiteten Klasse (in diesem Fall Derived) leer ist, der Lookup-Satz für ein Mitglied (in diesem Fall foo) aus allen direkten Basisklassen zusammengeführt wird. Da unsere Basisklassen jedoch unterschiedliche Deklarationssätze für foo haben, ist die Zusammenführung nicht eindeutig.

Problemumgehungen

Um die Mehrdeutigkeit zu beseitigen, können wir den Deklarationssatz auf Derived festlegen nicht leer durch Hinzufügen von using-Deklarationen für die foo-Methoden in den Basen:

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

Using-Deklarationen bringen Mitglieder aus Basisklassen in die abgeleitete Klasse und versorgen Derived effektiv mit zwei Überladungen von foo. Der Compiler kann dann eindeutig die entsprechende Überladung aufrufen.

Alternative Lösungen

  • Basiskollektorklasse: Diese Klassenvorlage kann mithilfe von Deklarationen sammeln für mehrere Basen, wodurch die Notwendigkeit expliziter Deklarationen reduziert wird.
  • Pack-Erweiterung in C 17: Die Pack-Erweiterung kann verwendet werden, um die BaseCollector-Vorlage auf eine einzige Zeile zu vereinfachen und sie so prägnanter und effizienter zu machen kompilieren.

Das obige ist der detaillierte Inhalt vonWie löst man Mehrdeutigkeiten bei der Mehrfachvererbung mit überlappenden Typen beim Aufruf polymorpher Methoden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!