Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++ Grundkurs

Mehrfachvererbung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
C++ verfügt über die Fähigkeit, eine Klasse gleichzeitig von mehreren Basisklassen abzuleiten. Dabei gibt der Programmierer die Namen der Basisklassen in einer Liste an.
03:34

Transkript

In dieser Lektion will ich Mehrfachvererbungen in C++ vorstellen. Um eine Klasse von mehreren Basisklassen abzuleiten, werden die Namen der Basisklassen in einer kommaseparierten Liste angegeben. Die Mehrfachvererbung verhält sich wie die Einfachvererbung. Jeder Basisklasse können ihre Zugriffsrechte vorangestellt werden. Die können verschieden sein. Per default sind die Zugriffsrechte bei Klassen *private*, für Strukturen *public*. Jetzt kommen die Probleme der Mehrfachvererbung. Enthält eine Instanz einer Klasse mehr als eine Instanz einer Basisklasse, ist der Aufruf ihrer Mitglieder mehrdeutig und führt zu einem Fehler. Das ist auch als sogenanntes Diamond-Problem bekannt. Das zeige ich Ihnen schnell. Eine Referenz auf ein Wiki und Sie sehen, was damit gemeint ist. Ich habe eine Basisklasse A, von der leite ich B ab und C ab und führe in der Klasse D, B und C zusammen, indem ich in der Klasse D von B und C ableite. Da entsteht eben, wenn ich mit D Methoden und Attribute von A referenziere eine Mehrdeutigkeit und die muss man auflösen. Die einfachste Art diese aufzulösen ist, dass sie bei Aufrufen den Namen der Basisklasse voranstellen. Das werde ich Ihnen zeigen. Hier ist die Klasse *Account*, die einen Konstruktor, der ein *double* annimmt und damit den *Account* initialisiert. Sie hat einen Methode *getBalance*, um den *Account* auszugeben. Von dieser Klasse leite ich zwei Klassen ab, den *BankAccount* und *WireAccount*. Die beiden Klassen tun eigentlich fast gar nichts. Die nehmen nur selbst ein *double*- Argument an und schieben es an ihre Unterklasse weiter. Zum Schluss kommt noch der *CheckingAccount*. Der leitet sich zweifach ab. Einerseits leitet er sich vom *BankAccount* ab, andererseits vom *WireAccount*. Wenn der *CheckingAccount* in seinem Konstruktor ein *double*-Argument bekommt, initialisiert er zwei Subobjekte, eines vom Typ *BankAccount* und eines vom Typ *WireAccount*. Da *BankAccount* und *WireAccount* jeweils selber ein Objekt vom Typ *Account* beinhalten, sieht man hier schon die Mehrdeutigkeit. Das kann man ganz einfach provozieren. Zuerst der Gutfall. Ich habe hier einen *CheckingAccount*, den ich mit 100 initialisiere und wenn ich *checkAccount.BankAccount::getBalance* aufrufe, indem ich sozusagen das Subobjekt *Account* referenziere, das Teil des *BankAccount* ist, dann sehen Sie, ist der Aufruf wohldefiniert und ich bekomme die entsprechende Zahl 100 raus. Das Gleiche kann er auch für *WireAccount* machen. Dann adressiere ich sozusagen das *Account*-Objekt vom *WireAccount*. Was passiert aber jetzt, wenn ich *checkAccount::getBalance* aufrufe? Es wird ein Fehler passieren. Darum habe ich es hingeschrieben. Warum passiert ein Fehler? Weil es der Compiler zwei Möglichkeiten hat, diesen Aufruf aufzulösen. Es gibt ein *Account*-Objekt, das in *BankAccount* drinnen ist und es gibt ein *Account-Objekt*, das in *WireAccount* drinnen ist. Durch das ist der Aufruf natürlich mehrdeutig. Das sieht man beim Kompilieren. Sie sehen, der Compiler moniert. Es gibt zwei *Account*s. Jetzt kommt er natürlich nicht mehr weiter, weil der Aufruf zweideutig ist. In dieser Lektion habe ich Ihnen die Mehrfachvererbung in C++ vorgestellt und Sie insbesondere auf das Problem der Mehrfachvererbung hingewiesen. Das Problem der Mehrfachvererbung ist es, dass, wenn Sie in einem Objekt mehr als ein Subobjekt vom gleichen Typ drinnen haben, es passiert, dass die Aufrufe in dieses Subobjekt mehrdeutig sind. Das bedeutet, der Compiler kann den Aufruf nicht eindeutig auflösen und es gibt einen Kompilierfehler, wie Sie ihn hier sehen.

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!