C++ Tutorial

Mehrfach abgeleitete Klassen

Grundprinzip der Mehrfach-Ableitung

Eine Klasse kann nicht nur von einer Klasse abgeleitet werden, sondern ebenfalls von mehreren. Nachfolgend ist anhand eines Bildes das Prinzip der mehrfachen Ableitung dargestellt. Die Klasse NumClass vereint alle Eigenschaften und Methoden der Klassen IntClass und FloatClass und fügt eventuell eigene hinzu.

Die Ableitung einer Klasse von mehreren Basisklassen erfolgt analog zum Ableiten von einer Basisklasse, lediglich werden bei der Definition der abgeleiteten Klasse mehrere Basisklassen aufgeführt einschließlich deren Zugriffsrecht. Die einzelnen Basisklassen werden dabei durch Komma voneinander getrennt.

1: // 1. Basisklasse
2: class IntClass
3: {...};
4: // 2. Basisklasse
5: class FloatClass
6: {...};
7: // Neue abgeleitete Klasse
8: class NumClass: public IntClass, protected FloatClass
9: {...}

Konstruktor und Destruktor

Außer der Klassendefinition ist der Konstruktor der abgeleiteten Klasse anzupassen. Er muss die Konstruktoren der Basisklassen aufrufen. Dazu wird, wie bei der einfachen Ableitung, nach der Parameterklammer zunächst ein Doppelpunkt angegeben und danach die Konstruktoren der Basisklassen aufgelistet. Einzige Ausnahme: Eine Basisklasse besitzt nur einen Standardkonstruktor (parameterloser Konstruktor). In diesem Fall erfolgt der Aufruf automatisch.

1: // ctor der abgeleiteten Klasse
2: NumClass::NumClass(P1,P2,...):
3:           IntClass{a1,a2,...},
4:           FloatClass{b1,b2,...}
5: {...}

Die Konstruktoren der Basisklassen werden in der Reihenfolge abgearbeitet, in der die Basisklassen bei der Definition der abgeleiteten Klasse aufgeführt sind. Im nachfolgenden Beispiel wird zuerst der Konstruktor der Klasse IntClass ausgeführt und danach der Konstruktor der Klasse FloatClass. Allerdings sollte bei sauberer Programmierung diese Reihenfolge keine Rolle spielen, da beide Basisklassen voneinander unabhängig sind.

1: // Definition der abgeleiteten Klasse
2: class NumClass: public IntClass, protected FloatClass
3: {...}
4: // Definition des ctors
5: NumClass::NumClass(P1,P2,...):
6:           IntClass{a1,a2,...},
7:           FloatClass{b1,b2,...}
8: {...}

Und für die Abarbeitung der Destruktoren gilt das Gleiche wie bei einfach abgeleiteten Klassen: Die Destruktoren werden in umgekehrter Reihenfolge ausgeführt wie die Konstruktoren.

Gleichnamige Member in den Basisklassen

Vorsicht ist geboten, wenn die Basisklassen und die abgeleitete Klasse Member mit gleichem Namen enthalten. In diesem Fall ist der Klassennamen vor dem Membernamen anzugeben. Dies gilt auch dann, wenn die Methoden unterschiedliche Parameter besitzen. Wie im vorherigen Kapitel erwähnt, funktioniert das Überladen von Methoden nur innerhalb einer Klasse und nicht über Klassengrenzen hinweg!

1: // 1. Basisklasse
2: class CBase1
3: {
4:    ...
5:    void DoAnything(...);
6: };
7: // 2. Basisklasse
8: class CBase2
9: {
10:    ...
11:    void DoAnything(...);
12: };
13: // Neue abgeleitete Klasse
14: class CDer: public CBase1, protected CBase2
15: {
16:    void AnyMeth(...)
17:    {
18:       CBase2::DoAnything();
19:    }
20:    ...
21: }

Und das war's schon zu mehrfach abgeleiteten Klassen.


Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz