Ableiten von Klassen

Man kann eine neue Klasse auf der Basis einer bereits vorhandenen Klasse bilden.

Die bereits vorhandene Klasse heißt dann Basisklasse, die neue Klasse ist eine Ableitung der Basisklasse.

Dies ist natürlich dann sinnvoll, wenn die neue Klasse ,,im Prinzip ähnlich ist``, und nur teilweise andere Eigenschaften oder Erweiterungen haben soll.

Die Datenelemente und Methoden der Basisklasse sind dann in der abgeleiteten Klasse ebenso enthalten, und können ergänzt oder -falls gewünscht- durch andere ersetzt werden.

Beispiel:

class Auto
{
protected:

  int    AnzahlRaeder;
  double Motorleistung;

public:

  // Konstruktor:
  Auto( double LeistungKW = 0.0, int nRad = 4 )
  {
    Motorleistung = LeistungKW;
    AnzahlRaeder = nRad;
  }

  // liefert die Anzahl Räder:
  int getRaeder()
  {
    return AnzahlRaeder;
  }
};

class Laster: public Auto
{
protected:

  double Zuladung;

public:

  // Konstruktor:
  Laster( double LeistungKW = 100.0,
          int nRad = 6,
          double Last = 2000.00
          )
  {
    Motorleistung = LeistungKW;
    AnzahlRaeder = nRad;
    Zuladung = Last;
  }

};

int main( int nargs, char **args )
{
  Auto   Golf; // 4 Räder, keine Leistung
  Auto   Ferrari( 250.0 ); // 4 Räder, 250kW

  // hat 100kW, 6 Räder, 2000.0kg Nutzlast:
  Laster Buessing;

  // hat 350.0kW, 10 Räder, 18000.0kg Nutzlast:
  Laster MAN( 350.0, 10, 18000.0 );

  cout << "Golf hat "  <<  Golf.getRaeder() << " Räder" << endl;
  cout << "MAN hat "  <<  MAN.getRaeder() << " Räder" << endl;
}

Die grundsätzliche Vorgehensweise beim Ableiten ist, daß man bei der neuen Klasse hinter dem Klassennamen mit einem Doppelpunkt getrennt die Basisklasse angibt (nach einem public oder private; zum Unterschied zwischen den beiden Möglichkeiten im nächsten Abschnitt mehr).

Damit enthält die abgeleitete Klasse alle Elemente und Funktionen, die in der Basisklasse bereits angelegt sind, und kann mit ihren Methoden auf alles zugreifen, was in der Basisklasse als public: oder protected: definiert ist.

Diese Übernahme von Elementen und Funktionen heißt Vererbung.

Ein Objekt der so abgeleiteten Klasse ist sowohl ein Objekt der abgeleiteten Klasse, als auch gleichzeitig eines der Basisklasse: ein Laster ist gleichzeitig auch ein Auto.

Umgekehrt gilt das nicht; der Golf des obigen Beispiels bekommt die Eigenschaft Zuladung nicht durch die Ableitung.

In dem obigen Beispiel erbt Laster von Auto die Elemente AnzahlRaeder und Motorleistung und definiert sich zusätzlich noch Zuladung.

Ebenso wird die Funktion getRaeder() geerbt, während der Konstruktor hier durch einen neuen ersetzt wird.

Durch den Vererbungsmechanismus kann ein Laster die Funktion getRaeder() der Basisklasse mitnutzen.

Daß ein Laster auch gleichzeitig ein Auto ist, hat zur Folge daß man problemlos überall wo ein Auto stehen darf, auch einen Laster verwenden darf:

void Machwas( Auto a )
{
  //...
}
//...
  Laster   Tatra;
  Auto     meineKarre;
  Machwas( Tatra );
  meineKarre = Tatra;

Der Compiler kann bei Bedarf jederzeit von einer abgeleiteten Klasse zu einer Basisklasse casten (gegebenenfalls auch implizit). Dies geht auch über mehrere Ableitungsstufen hinweg.

Natürlich kann die Funktion Machwas() nicht auf das Laster-Element Zuladung zugreifen, weil der Compiler an dieser Stelle nur von einem Auto ausgehen kann.

Ebenso wird bei der Zuweisung eines Laster an ein Auto das Element Zuladung ,,abgestreift``.

Wenn dieses ,,Abstreifen`` ein Problem ist, dann steht die Lösung in Virtuelle Methoden.



Unterabschnitte
AnyWare@Wachtler.de