Mehrfach abgeleitete Klassen

Mehrfach-Ableitung

Eine Klasse kann nicht nur von einer Klasse abgeleitet werden, sondern auch von mehreren. Nachfolgend ist anhand eines Bildes das Prinzip der mehrfachen Ableitung dargestellt. Die Klasse Hybrid vereint alle Eigenschaften und Methoden der Klassen Electric und Petrol 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 in einer kommaseparierten Liste aufgeführt.

// 1. Basisklasse
class Electric
{...};
// 2. Basisklasse
class Petrol
{...};
// Neue abgeleitete Klasse
class Hybrid: public Electric, public Petrol
{...}

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.

// ctor der abgeleiteten Klasse
Hybrid::Hybrid(P1,P2,...):
        Electric{a1,a2,...},
        Petrol{b1,b2,...}
{...}

Die Konstruktoren der Basisklassen werden in der Reihenfolge abgearbeitet, in der die Basisklassen bei der Definition der abgeleiteten Klasse aufgeführt sind. Allerdings sollte bei sauberer Programmierung diese Reihenfolge keine Rolle spielen, da beide Basisklassen voneinander unabhängig sind.

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. Basisklasse
class Electric
{
   ...
   void Print();
};
// 2. Basisklasse
class Petrol
{
   ...
   void Print();
};
// Neue abgeleitete Klasse
class Hybrid: public Electric, public Petrol
{
   void Out()
  {
     Electric::Print();
     Petrol::Print();
   }
}

Und das war's schon zu mehrfach abgeleiteten Klassen.