C++ Grundkurs

Virtuelle Basisklassen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die Definition von virtuellen Basisklassen vermeidet bei der Mehrfachvererbung, dass ein Objekt einer abgeleiteten Klasse mehrere Objekte einer Basisklasse enthalten kann.
03:24

Transkript

In dieser Lektion möchte ich Ihnen die Mehrfachvererbung in C++ mit virtuellen Basisklassen vorstellen. Was ist der Unterschied zwischen virtuellen und nicht virtuellen Basisklassen? Bei nicht virtuellen Basisklassen gibt es das klassische Problem, dass es passieren kann, dass eine abgeleitete Klasse mehrere Instanzen von Objekten einer Basisklasse besitzen kann. Das ist das sogenannte Diamond-Problem. Das Problem ist, dass es passiert, wenn Sie in einer abgeleiteten Klasse Mitglieder der Basisklasse aufrufen, dieser Aufruf nicht eindeutig ist, also mehrdeutig und der Compiler dies mit einer Fehlermeldung moniert. Durch *virtual* erreichen Sie, dass Sie nur eine Instanz der Basisklasse in Ihrem Objekt tatsächlich haben. Erreicht wird *virtual*, dass Sie das Schlüsselwort *virtual* bei der Ableitung voranstellen. Es gibt aber ein gemeines Problem bei den virtuellen Basisklassen. Das Problem ist, falls für virtuelle Basisklassen kein Default-Konstruktor verwendet wird, muss dieser explizit in der abgeleiteten Klasse aufgerufen werden. Das hört sich jetzt kompliziert an, darum zeige ich es gleich in der Anwendung. Hier meine Klasse *Account*. Die Klasse *Account* besitzt einen Konstruktor, der mit einem *double*-Wert initialisiert wird. Das Entscheidende an dieser Stelle ist, diese Klasse *Account *besitzt keinen Default-Konstruktor. Die Klasse besitzt eine Methode *getBalance*, um den aktuellen Kontostand auszugeben. Wie geht es weiter? Von der Klasse leite ich zweimal ab *BankAccount* und *WireAccount*. Beides mal leite ich von *Account ab*, beides mal virtuell. Das bewirkt, dass ich in einer weiteren Klasse, in der ich von *BankAccount* *public* ableite und *WireAccount* *public* ableite, *CheckingAccount* nennt sich diese Klasse dann, dass in diese Klasse nur einmal *Account* drinnen ist. Ich habe also nur einSubobjekt *Account* in *CheckingAccount*. Damit sind Aufrufe von Objekten von Typ *CheckingAccount* eindeutig. Das ist das Problem, das virtuelles Ableiten löst. Jetzt habe ich die Struktur erklärt, jetzt zeige ich Ihnen den Code. Ich definiere hier einen *checkAccount*, initialisiere ihn mit 100 und mit dem kann ich jetzt *getBalance* aufrufen und der Aufruf geht gut. Er ist eindeutig und als Ergebnis bekomme ich raus 100. Ich kann natürlich auch das eine Subobjekt *Account* über *BankAccount* adressieren oder über *WireAccount*. Jeweils kommt das gleiche Ergebnis heraus. Was passiert jetzt, wenn ich diesen Konstruktor hier ein- und diesen auskommentiere? Ich übersetze das Programm einmal und bekomme einen Kompilierfehler. Warum bekomme ich einen Kompilierfehler? Weil ich in diesem Fall den Konstruktor *Account* auskommentiert habe. D.h., in diesem Fall kann der Compiler kein *Account*-Objekt initialisieren. Das hängt damit zusammen, dass *Account* keinen Default-Konstruktor besitzt. Ich also explizit einen Konstruktor angeben muss. Das ist eben diese Besonderheit der virtuellen Ableitung. In dieser Lektion habe ich Ihnen die virtuelle Mehrfachableitung in C++ vorgestellt. Dadurch erreichen Sie, dass Sie das Diamond-Problem lösen, sprich, dass eine abgeleitete Klasse nur eine Instanz einer Basisklasse enthält und nicht mehrere. Das Problem, das aber gerne auftritt ist, dass, wenn Sie in der Basisklasse keinen Default-Konstruktor haben wie hier in *Account*, dass Sie diesen explizit angeben müssen in Ihrer Klasse, die anderen Klassen zusammenführt, denn sonst gibt es einen Kompilierfehler.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!