C ++ Diamond Problem

C ++ Diamond Problem
Ein Diamantproblem ist ein Problem, das in Programmiersprachen, insbesondere in C ++, auftritt, wenn Sie mehrere Vererben verwenden. Mehrere Vererbung in C ++ werden üblicherweise als Tool verwendet, wenn der Code sehr lang ist. Um den Quellcode zu verarbeiten, verwenden wir Klassen, um das Programm zu verwalten. Die mehrfachen Erbschaften verursachen jedoch ein Problem, wenn es nicht ordnungsgemäß verwendet wird. Diese Probleme enthalten hauptsächlich das Diamantproblem. Dieses Tutorial zielt darauf ab, die Hauptfaktoren des Diamantproblems, wie es aus den mehreren Erbschaften und allen zur Lösung erforderlichen Lösungen hervorzuheben ist.

Um die Programme zu „C ++ Diamond Inheritance“ im Linux -Betriebssystem auszuführen, müssen Sie ein Ubuntu -System installiert und auf der virtuellen Maschine ausgeführt werden. Es werden zwei Werkzeuge verwendet. Eines ist jedes Bearbeitungswerkzeug, und als solches werden wir den Standard "Texteditor" von Linux verwenden. Sie können andere bevorzugte Bearbeitungswerkzeuge verwenden. Der zweite ist das Ubuntu -Terminal. Auf welchem ​​Welchen werden Sie das Programm ausführen und die angezeigte Ausgabe sehen.

Erstens werden wir mehrere Erbschaften im Artikel diskutieren, da das „Diamantproblem“ bei der Vererbung im Quellcode auftritt.

Mehrere Erbschaften in c++

Wenn wir über die Verwendung von Klassen hierarchisch im Programm sprechen, wissen wir immer OOP (objektorientierte Programmierung). Weil diese Vererbung ein wichtiges Merkmal von objektorientiertem ist, bei dem eine Unterklasse von einer oder mehreren Superklassen erben kann. Auf diese Weise hat eine Kinderklasse zwei oder mehr Eltern.

Wenn beispielsweise Mutter und Vater ein Kind in einem realen Szenario haben, wird das Kind alles von den Eltern erben. Es ist bekannt, dass dieses Kind eine abgeleitete Klasse mit Mutter und Vater als Eltern ist. Gehen wir zurück zu den vielfältigen Erbschaften. Wir werden „Konstruktoren“ als Teil unserer aktuellen Diskussion verwenden. Die Konstrukteure einer ererbten Klasse (Kinderklasse) in mehreren Erbschaften werden durch Befolgen ihrer ererbten Reihenfolge ausgeführt. Während für die Zerstörer ist die Reihenfolge die Umkehrung des Vererbung. Jetzt werden wir ein einfaches Beispiel zitieren, um die Funktionalität der Vererbung in C zu demonstrieren++.

Beispiel für mehrere Erbschaften

Betrachten Sie ein Beispiel, in dem es als Elternklasse zwei Klassen, Klasse A und Klasse B gibt, und diese beiden Klassen haben eine untergeordnete Klasse C -Klasse C. Diese Klasse ist eine abgeleitete Klasse von beiden Elternteilen. Wir werden einen Konstruktor im öffentlichen Teil jeder Klasse verwenden.

Der erste Schritt im Code besteht darin, eine Bibliothek zu verwenden, um das Streaming für Eingabe-Ausgänge zu ermöglichen:

Dann müssen wir die Klasse A deklarieren und die Konstruktoren mit dem Namen der Klasse haben. Wie Sie wissen, dass Konstruktoren mit dem Namen dieser Klasse deklariert werden, werden diese aufgerufen, wenn das Objekt erstellt wird. Im Konstruktor wurde eine einfache Nachricht angezeigt, die zeigt, welcher Klassenkonstruktor ausgeführt wird. Jetzt definieren wir Klasse B mit dem gleichen Ansatz. Nach beiden Elternklassen wird die Kinderklasse erwähnt.

Eine Sache, die hier angemerkt werden sollte, ist die Reihenfolge der übergeordneten Klassen, die das Kind erbt, da diese Reihenfolge zum Zeitpunkt der Konstruktorausführung und einer Nachricht angezeigt wird, die angezeigt wird.

Jetzt, in der Hauptklasse, werden wir ein Objekt der Kinderklasse erstellen. Da es mehrere Erbschaften aufweist, müssen das Objekt für die übergeordnete Klasse nicht erstellt werden. Sie werden automatisch wegen des Objekts für Kinderklassen ausgeführt:

Int main ()
C c;
Rückkehr 0;

Speichern Sie diese Datei nach dem Schreiben des vorherigen Code im Texteditor mit der Erweiterung von '.C'. Wir werden die Datei im Ubuntu -Terminal ausführen. Für den Ausführungszweck ist ein Compiler erforderlich. In C ++ verwenden wir einen G ++ - Compiler. Andernfalls müssen Sie es zuerst installieren:

$ G ++ -O M1 M1.C
$ ./M1

Verwenden Sie G ++ mit dem Namen der Datei mit dem Quellcode und dem, in dem Sie die Ausgabe anzeigen möchten. Hinweis, -O wird verwendet, um die Ausgabe zu speichern. Da die Klasse B über der Klasse A geerbt wird, wird der Konstruktor zuerst ausgeführt, und Sie können die Ausgabe aus dem vorherigen Bild sehen.

Da das Konzept der Vererbung jetzt klar ist, werden wir hier das „Diamantproblem“ diskutieren.

Diamantproblem

Ein Diamantproblem ist ein Fall nur bei mehreren Erbschaften, die auftreten, wenn eine Kinderklasse die Werte von den beiden Elternteilen vererbt hat. Wobei diese Elternklassen von einer gemeinsamen Großelternklasse geerbt werden.

Betrachten Sie zum Beispiel ein Beispiel, in dem eine Kinderklasse aus den Klassen von Mutter und Vater geerbt wird. Diese Klassen erben eine dritte Klasse namens "Person":

Kind> Mutter> Person
> Vater> Person

Nach dem angegebenen Szenario erbt die Kinderklasse also zweimal die Klasse „Person“ im Programm. Einmal ist es von der Mutter, und wieder ist das zweite Mal vom Vater. Dies schafft Verwirrung für den Compiler, den Konstruktor zuerst auszuführen. Diese Situation führt zu einem Diamant-förmigen Vererbungsgraphen. Daher ist es als „Diamond -Problem“ bekannt.

Der Codeansatz ist fast der gleiche. Deklariere die Basisklasse und dann zwei erbte Kinderklassen (Mutter, Vater) der Basisklasse. Auf jede Klasse folgt der Konstruktor mit einer Variablen, um einen Wert darin zu speichern:

Stellen Sie nun die Kinderklasse vor:

# Klassenkind: öffentlicher Vater, öffentliche Mutter

Die untergeordnete Klasse wird beide Elternklassen erben. Die Hauptfunktion verwendet das Objekt des Kindes und einen Wert im Parameter des Konstruktoraufrufs:

Nach dem Speichern des Codes ist es Zeit, den Compiler für die Ausführung zu verwenden und das Ergebnis zu sehen:

Jetzt können Sie beobachten, dass die Basisklasse zweimal aufgerufen wird. Dies ist ein Diamantproblem. Nachdem wir das Problem beschrieben haben, werden wir nun eine mögliche Lösung finden.

Lösung des Diamantenproblems

Die Lösung hängt von der Verwendung des Schlüsselworts "Virtual" ab. Zwei-Eltern-Klassen mit einer gemeinsamen Basisklasse erben nun die Basisklasse praktisch, um das Auftreten von Kopien der Basisklasse in der Kinderklasse zu minimieren. Jetzt werden wir den Code mit diesem Schlüsselwort ändern:

Wenn die Elternklasse von der Großelternklasse erbt, wird „virtuell“ verwendet, aber nur bei den Eltern, nicht bei einem Kind. Dies ist "das virtuelle Erbe". Es begrenzt das Bestehen von mehr als einer einzelnen Instanz aus der zu bestehenden Basisklasse.

# Klassen Vater: Virtuelle öffentliche Person

Jetzt werden wir den Code ausführen. Die resultierenden Werte zeigen, dass Unklarheit unter Verwendung dieses Konzepts entfernt wird:

Um die Wiederholung des aufgerufenen Basiskonstruktors zu vermeiden, wird der Konstruktor für eine virtuelle Basisklasse nicht durch die Klasse erreicht, die sie geerbt hat. Dieser Konstruktor wird jedoch aus dem konkreten Klassenkonstruktor aufgerufen. Im aktuellen Beispiel ruft die untergeordnete Klasse den Konstruktor der „Person“ direkt an.

Abschluss

"C ++ Diamond Problem" ist ein Artikel, der geschrieben wurde. Das Konzept der Vererbung wird kurz mit Beispielen erklärt. In ähnlicher Weise werden die Ursache und die Lösung für das Diamantproblem ebenfalls ausführlich ausgearbeitet. Wir hoffen.