Die Beziehung zwischen Vererbungsmethoden und Zugriffsqualifizierern
Drei Vererbungsmethoden:
Öffentliche Vererbung
Private Vererbung
Geschützte Vererbung
Beziehung: Wenn die Mitgliedsfunktion der Basisklasse privat ist, werden die privaten Mitglieder der abgeleiteten Klasse zur Basisklassen sind unsichtbar, andere Kriterien sind auf einen kleinen Auswahlbereich für den endgültigen Zugriff beschränkt.
Qualifikationsmerkmal für geschützte Mitglieder: Auf einige Basisklassenmitglieder soll nicht direkt von Objekten der Basisklasse zugegriffen werden, sondern es muss in der abgeleiteten Klasse darauf zugegriffen werden. Sie werden als geschützte Mitglieder definiert. Qualifizierer für geschützte Mitglieder entstehen durch Vererbung.
Verstecken verstehen
Ausblenden bedeutet, dass die Funktion der abgeleiteten Klasse die Basisklassenfunktion mit demselben Namen blockiert. Die Regeln lauten wie folgt:
Wenn die Funktion der abgeleiteten Klasse denselben Namen wie die Funktion der Basisklasse hat, die Parameter jedoch unterschiedlich sind, ist die Funktion zu diesem Zeitpunkt die Die Basisklasse wird unabhängig vom Schlüsselwort virtual ausgeblendet.
Wenn die abgeleitete Klassenfunktion denselben Namen wie die Basisklassenfunktion hat und die Parameter dieselben sind, die Basisklassenfunktion jedoch nicht über das virtuelle Schlüsselwort verfügt, dann wird die Basisklassenfunktion verwendet ist versteckt.
Standard-Memberfunktionen abgeleiteter Klassen
Wenn die sechs Standard-Memberfunktionen nicht explizit in der abgeleiteten Klasse definiert sind, synthetisiert das Kompilierungssystem diese sechs Memberfunktionen standardmäßig .
Konstruktor
Kopierkonstruktor
Destruktor
Zuweisungsoperator überlastet
Adressoperator überlastet
Const-modifizierter Adressoperator überlastet
#include<iostream> using namespace std; class person{ public: person(const char* name) :_name(name) { cout<<"person()"<<endl; } person(const person& p){ cout<<"person(const person& p)"<<endl; } person& operator=(const person& p){ cout<<"person& operator=(const person& p)"<<endl; if(this!=&p){ _name=p._name; } return *this; } ~person(){ cout<<"~person()"<<endl; } protected: string _name; }; class student:public person{ public: student(const char* name,int num) :person(name) ,_num(num){ cout<<"student()"<<endl; } student(const student& s) :person(s) ,_num(s._num) { cout<<"student(const student& s)"<<endl; } student& operator=(const student& s){ cout<<"student& operator=(const student& p)"<<endl; if(this!=&s){ person::operator=(s);//必须指定域,否则会死循环 _num=s._num; } return *this; } ~student(){//析构的时候先清理子类,再清理父类,不需要显示的调用 cout<<"~student()"<<endl; } private: int _num; }; int main(){ student s1("jack",18); student s2(s1); student s3("rose",16); s1=s3; }
Diamantvererbung
Diamantvererbung weist Mehrdeutigkeits- und Datenredundanzprobleme auf.
Zum Beispiel handelt es sich bei den vererbten Daten in der folgenden Abbildung um zwei Kopien, die jeweils unterschiedlich sind:
Lösung: virtuelle Vererbung
im Diamant Fügen Sie virtuell
zur zweiten Ebene hinzu. Beispiel:
Verwandte Artikel:
Zusammenstellung von C#-Grundkenntnissen: Grundkenntnisse (2) Klasse
Verwandte Videos:
Qianfeng C-Sprachgrundlagen Video Tutorial
Das obige ist der detaillierte Inhalt von[C++] Vertiefendes Verständnis der Grundkenntnisse der Vererbung und ihrer Beziehung zu Zugriffsqualifizierern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!