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"; } };
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>
Beim Aufruf von Derived().foo
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>
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
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!