Kategorien
C++

Einführung in C++ – Klassen: Vererbung, Adjustment, Friends, abstrakt – Teil5

Vererbung

Klassen können Funktionen und Member-Variablen vererben an anderen Klassen.

Class A{
public:
 void f();
};
Class B : public A{};//B erbt public von A
B* b = new B;
b.f(); //Funktion ist vorhanden, da geerbt
  • public: auf diese Elemente kann von überall her zugegriffen werden
  • protected: Zugriff auf Element nur von Elternklassen und abgeleitete Klassen (sowie die Klasse, die das Element definiert)
  • private: nur die definierende Klasse

Vererbungsregeln

Vererbung: public

Class B : public A{};

Basisklasse/abgeleitete Klasse
private/nicht sichtbar
protected/protected
public/public

Vererbung: protected

Class B : protected A{};

Basisklasse/abgeleitete Klasse
private/nicht sichtbar
protected/protected
public/protected

Vererbung: private

Class B : private A{};

Basisklasse/abgeleitete Klasse
private/nicht sichtbar
protected/private
public/private
  • abgeleitete Klasse ist auch eine Basisklasse
Class A{};
Class B : public A{};
A* a = new B; //ok
B* b = new A; //Fehler, Umkehrung gilt nicht

Adjustment

  • wiederherstellen der ursprünglichen Rechte (der Basisklasse) in der abgeleiteten Klasse
  • nur bei private/protected Vererbung logischer Weise
  • nur wiederherstelle, keine anderen/besseren Rechte möglich
Class A{
 public:
 int a1;
};
Class B : private A{
 public:
 A::a1; //Adjustment nach public von private
};

B* b = new B;
int a = b.a1; //ok, da public

Friends

  • Zugriff auf private/protected Variablen möglich von außerhalb der Klasse
  • werden nicht vererbt

Friend Funktionen

Class A{
 public:
 int a; //private
friend void writeA(A& einA);
};

void writeA(A& einA){
 einA.a = 2; //Zugriff von außerhalb der Klasse auf privates Element
}

Friend Klassen

Class A{
 A(){}; //Konstruktor private gesetzt
 public:
 friend class Creator;
};

Class Creator{
  A* newA; //Konstruktor private gesetzt
 public:
  Creator(){
   newA = new A;
  }; //Konstruktor mit Zugriff auf private Konstruktor von A
};

A* a = new A; //Fehler, Konstruktor ist private
Creator* or = new Creator; // ok, A Objekt in Creator angelegt

 Virtualität und abstrakte Klassen

  • abstrakte Klassen und Methoden möglich wie in Java
  • in Basisklasse werden „Interfaces“ beschrieben, die in abgeleiteter Klasse implementiert werden
  • ist möglich durch Late Binding: pro Klasse wird eine virtuelle Methoden Tabelle(VMT) angelegt
Class A{
 public:
 virtual void print(){cout "ein A"};
};
Class B : public A{
 public:
 void print(){cout "ein B"};
};

B* pb = new B;
A* a = b; //ok, ist ein Vererbung, siehe oben
pa->print(); // "ein B", ohne virtual wäre es "ein A"
pb->print(); // "ein B"

Aber:

A* pa2 = new A;
pa2->print(); //"ein A", ist bei abstrakten Klassen nicht erwünscht

Deswegen:

Class A{
 public:
 virtual void print() = 0; //"pure virtual function", richtige abstrakte Funktion
};

Die Klasse A ist damit eine so genannte „abstract base class“, weil sie eine „pure virtual function“ enthält, die die Kinds-Klassen implementieren müssen.

Inhaltsverzeichnis:

Einführung in C++ – Vorteile, Compiler, Namespaces – Teil1

Einführung in C++ – Zeiger, Pointer,Referenzen – Teil2

Einführung in C++ – Datentypen, Casting, Klassen – Teil3

Einführung in C++ – Funktionen und Operatoren überladen (Overloading) – Teil4

Einführung in C++ – Klassen: Vererbung, Adjustment, Friends, abstrakt – Teil5