Mehrfachvererbung in C ++ und das Diamantproblem

Im Gegensatz zu vielen anderen objektorientierten Programmiersprachen ermöglicht C ++ die Mehrfachvererbung.

Durch Mehrfachvererbung kann eine untergeordnete Klasse von mehr als einer übergeordneten Klasse erben.

Am Anfang scheint es eine sehr nützliche Funktion zu sein. Bei der Implementierung dieser Funktion muss ein Benutzer jedoch einige Fallstricke beachten .

In den folgenden Beispielen werden einige Szenarien behandelt, auf die man achten muss.

Wir beginnen mit einem einfachen Beispiel, um dieses Konzept in C ++ zu erklären.

Die Ausgabe dieses Codes lautet wie folgt:

I'm breathing as a snake.I’m crawling as a snake.

Im obigen Beispiel haben wir eine Basisklasse namens LivingThing . Das Tierund Reptilienklassen erben davon. Nur das TierKlasse überschreibt die Methode breathe(). Die Snake- Klasse erbt von den Animal- und Reptile- Klassen. Es überschreibt ihre Methoden. Im obigen Beispiel gibt es kein Problem. Unser Code funktioniert gut.

Jetzt werden wir ein bisschen Komplexität hinzufügen.

Was ist, wenn die Reptilienklasse die breathe()Methode überschreibt ?

Die Snake- Klasse würde nicht wissen, welche breathe()Methode sie aufrufen soll. Dies ist das „Diamantproblem“.

Diamantproblem

Schauen Sie sich den Code unten an. Es ist wie der Code im obigen Beispiel, außer dass wir die breathe()Methode in der Reptile- Klasse überschrieben haben .

Wenn Sie versuchen, das Programm zu kompilieren, wird dies nicht der Fall sein. Sie werden auf eine Fehlermeldung wie die folgende starren.

member ‘breathe’ found in multiple base classes of different types

Der Fehler ist auf das „Diamantproblem“ der Mehrfachvererbung zurückzuführen. Die Snake- Klasse weiß nicht, welche breathe()Methode aufgerufen werden soll.

Im ersten Beispiel hatte nur die Animal- Klasse die überschriebenbreathe()Methode. Die Reptilienklasse hatte nicht. Daher war es für die Snake- Klasse nicht sehr schwierig herauszufinden, welche breathe()Methode aufgerufen werden sollte. Und die Snake- Klasse rief schließlich die breathe()Methode der Animal- Klasse auf.

Im zweiten Beispiel erbt die Snake-Klasse zweibreathe() Methoden. Die breathe()Methode der Tier- und Reptilienklasse . Da wir die breathe()Methode in der Snake- Klasse nicht überschrieben haben , besteht Mehrdeutigkeit.

C ++ verfügt über viele leistungsstarke Funktionen wie Mehrfachvererbung. Es ist jedoch nicht erforderlich, dass wir alle darin enthaltenen Funktionen verwenden.

Ich bevorzuge nicht die Mehrfachvererbung und verwende stattdessen die virtuelle Vererbung.

Die virtuelle Vererbung löst das klassische „Diamantproblem“. Es stellt sicher, dass die untergeordnete Klasse nur eine einzige Instanz der gemeinsamen Basisklasse erhält.

Mit anderen Worten, die Snake- Klasse hat nur eine Instanz der LivingThing- Klasse. Die Klassen Animal und Reptile teilen sich diese Instanz.

Dies behebt den Fehler bei der Kompilierung, den wir früher erhalten haben. Von abstrakten Klassen abgeleitete Klassen müssen die in der Basisklasse definierten reinen virtuellen Funktionen überschreiben.

Ich hoffe, Ihnen hat dieser Überblick über Mehrfachvererbung und das „Diamantproblem“ gefallen.