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
