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