2016-08-05 40 views
0

Meine Fragen sind, warum keinen Kompilierungsfehler verursacht?Warum Sub-Klasse auf C++ private Vererbung Mitglied zugreifen?

Klasse B ist privat, vererben Klasse A und x und y sind Mitglieder der Klasse A.

class A { 
    public: 
    int x; 
    int y; 
    void set(int a, int b) { x = a; y =b;} 
    }; 

class B : private A{ 
    public: 
    int getmultiply (void){ 
     return x*y;} 
}; 

int main(void) 
{ 
    B b; 
    //b.set(3,4);  // this will cause compilation error 
    cout << b.getmultiply(); // why this will not?? 
    return 0; 
} 

Antwort

3

Wenn Sie private von einer Basisklasse erben, werden ihre öffentlichen Mitglieder private Mitglieder der abgeleiteten Klasse. Diese Mitglieder sind öffentlich und innerhalb von Mitgliedsfunktionen der abgeleiteten Klasse zugänglich (z. B. B.getmultiply()), sind jedoch privat und für externen Code nicht zugänglich (z. B. main()), der kein Freund der abgeleiteten Klasse ist.

+0

Danke und ich verstehe es endlich. – jmmom

0

Wenn eine Klasse privat von einer anderen erbt, hat sie immer noch Zugriff auf die (nicht privaten) Mitglieder dieser Klasse, genau wie bei der öffentlichen Vererbung. Es ist nur die Außenwelt, die keinen Zugang zu ihnen hat, weil sie im Kontext der abgeleiteten Klasse privat werden (die Außenwelt weiß nicht einmal, dass das Abgeleitete abgeleitet ist: man kann sich nicht auf ein Instanz von B mit einem Zeiger vom Typ A zum Beispiel).