virtuelle Basisklasse
Ich frage mich, ob Sie bei dem Vererbungsprozess, den ich zuvor gelernt habe, an diese Situation gedacht haben: Wenn in einer Mehrfachvererbungsbeziehung eine abgeleitete Klasse von zwei übergeordneten Klassen erbt und diese beiden übergeordneten Klassen zufällig von einer erben Von der Basis geerbt Klasse. Das wäre problematisch, da Sie möglicherweise zwei Kopien desselben Mitglieds erben würden!
Dies führt zum sogenannten Mehrdeutigkeitsproblem . Beginnen wir mit dem Lernen!
Lassen Sie mich zunächst ein Beispiel geben, das diese Art der Mehrfachvererbung veranschaulicht! Ich dachte darüber nach und kam auf dieses Beispiel: Zuerst gab es zwei Söhne, die den Schlüssel zur Tür hatten Als sie ein paar Jahre alt waren und der männliche Meister alt war, schenkte er ihnen zwei weitere Schlüssel und überließ ihnen die Leitung des Familienunternehmens. Nach vielen Jahren heirateten die beiden Söhne. und es gab jeweils einen Jungen und ein Mädchen, die die Familienlinie weiterführten. Den sogenannten Menschen geht es gut, und später sind sie erwachsen, und es ist Zeit, den Schlüssel zu übergeben. In der Antike wurde der Schlüssel natürlich an den Jungen weitergegeben, also wurde der Schlüssel natürlich auch an den Enkel weitergegeben Diesmal mussten der Vater des Enkels und sein Onkel (also die beiden Söhne des ursprünglichen Besitzers) dem Enkel jeweils einen Schlüssel geben, sodass er zwei Schlüssel hatte. Der kleine Enkel blickte auf die beiden Schlüssel in seiner Hand und sagte: „Einer reicht! Zwei … ist das nicht eine Verschwendung?“
Nach dem Lesen dieser Geschichte wird es für jeden einfacher sein, die Vererbung zu verstehen. Der ursprüngliche männliche Protagonist in der Geschichte, Opa, ist die Basisklasse. Seine beiden Kinder sind zwei abgeleitete Klassen, und das Kind von einem von ihnen ist das Kleine. Sun Tzu ist die letzte abgeleitete Klasse, da er von zwei abgeleiteten Klassen erbt. Und diese beiden abgeleiteten Klassen haben ein gemeinsames Mitglied (Schlüssel, weil sie beide dieselbe Basisklasse erben – Opa). Die letzte abgeleitete Klasse von Sun Tzu hat zwei doppelte Mitglieder (Schlüssel), was die Ursache für Mehrdeutigkeit ist!
Im Folgenden folgen wir diesem Beispiel und schreiben den Code konkret, Sie können darauf verweisen:
/****************************************//Des: C++-Tutorial-Demo//Autor: Huang/ /Copyright:www.dotcpp.com//Datum:18.12.2017********************************* * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){ EnkelA ;//A.key=9;return0;}
Der Code ist gerade eine Manifestation der Geschichte. Der Einfachheit halber sind die vier definierten Klassen leer. Konzentrieren Sie sich nur auf die Vererbungsbeziehung. Das heißt, die Grandson-Klasse erbt zwei Vaterklassen und verfügt über zwei Schlüsselmitglieder. Wenn Sie zu diesem Zeitpunkt versuchen, diesen Schlüssel zu verwenden, beachten Sie bitte, dass er als öffentlicher Typ deklariert wurde, wenn Sie versuchen, einen Wert in der Hauptfunktion zuzuweisen Es wird die Fehlermeldung „nicht eindeutig, mehrdeutig“ angezeigt, das heißt, es tritt ein sogenanntes Mehrdeutigkeitsproblem auf, das jeder gut verstehen kann.
Wie kann man dieses Problem vermeiden? In diesem Fall müssen Sie virtuelle Basisklassen verwenden! Die sogenannte virtuelle Basisklasse besteht darin, sie vor dem Erben des öffentlichen Typs beim Erben zu ändern. In diesem Beispiel muss die Vaterklasse beispielsweise nur eine zusätzliche virtuelle Klasse hinzufügen, wenn sie die Großvaterklasse erbt Die Klasse und die Basisklasse verwalten nur eine Kopie eines Basisklassenobjekts. Vermeiden Sie Mehrfachkopien und Mehrdeutigkeiten.
Die Definitionsmethode besteht darin, beim Ableiten der beiden übergeordneten Klassen eine virtuelle Deklaration hinzuzufügen:
classFather1:virtualpublicGrandfatherclassFather2:virtualpublicGrandfather
Der Rest bleibt unverändert. Sie können es auf Ihrem eigenen Computer testen, um die Entstehung von Mehrdeutigkeiten und die Verwendung virtueller Basisklassen zu verstehen.