2009-06-08 10 views
11

Ich habe C++ nicht getan in eine Weile und kann nicht herausfinden, warum folgende funktioniert nicht:Warum kann ich von einer Instanz einer abgeleiteten Klasse nicht auf ein geschütztes Mitglied zugreifen?

class A { 
protected: 
    int num; 
}; 

class B : public A { 
}; 

main() { 
    B * bclass = new B(); 
    bclass->num = 1; 
} 

Kompilieren erzeugt dies:

Fehler C2248: 'A :: num' : kann nicht auf das in der Klasse 'A' deklarierte geschützte Element zugreifen

Sollten nicht geschützte Member für abgeleitete Klassen zugänglich sein?

Was fehlt mir?

Antwort

31

Ja geschützte Member sind für abgeleitete Klassen zugänglich, aber Sie greifen auf sie in der main() -Funktion zu, die außerhalb der Hierarchie liegt. Wenn Sie eine Methode in der Klasse B und Zugriffsnummer deklarieren, wird es in Ordnung sein.

+0

Vielen Dank! Ich sehe meinen Fehler jetzt –

13

Ja, geschützte Mitglieder sind für die abgeleitete Klasse zugänglich, aber nur innerhalb der Klasse.

Beispiel:

#include <iostream> 

class A { 
    protected: 
    int num; 
}; 

class B : public A { public: 
    void printNum(){ 
     std::cout << num << std::endl; 
    } 

}; 

main() { 
    B * bclass = new B(); 
    bclass->printNum(); 
} 

den Wert von num ausdrucken, aber num aus Klasse B zugegriffen wird. num müsste öffentlich deklariert werden, um als bclass->num zugreifen zu können.

8

Es ist im Rahmen der B-Funktionen zugänglich, aber Sie versuchen, es in Main zuzugreifen.

6

Sie greifen jedoch nicht von der abgeleiteten Klasse darauf zu. Sie greifen von main() darauf zu.

3

"Geschützt" bedeutet geschützt vor Zugriff außerhalb einer Memberfunktion oder einer Memberfunktion einer abgeleiteten Klasse. Die Funktion "main" ist kein Mitglied einer der beiden Klassen, versucht jedoch direkt auf die Elementvariable zuzugreifen.

4

Bei der Verwendung einer Klasse gibt es keinen Unterschied zwischen geschützten und privaten Mitgliedern. Beide sind für nichts zugänglich, das die Klasse nutzt.

class A { 
    private: int privateNum; 

    protected: int protectedNum; 

    public: int publicNum; 

    void SetNumbers(int num) { 
     privateNum = num; //valid, private member can be accessed in member function 
     protectedNum = num; //valid, protected member can be accessed in member function 
} 

void main() { 
    A classA; 
    classA.privateNum = 1; //compile error can't access private member 
    classA.protectedNum = 1; //compile error can't access protected member 
    classA.publicNum = 1; //this is OK 
    classA.SetNumbers(1); //this sets the members not accessible directly 
} 

Der Unterschied tritt auf, wenn Sie von einer Klasse mit geschützten Elementen erben.

Alle privaten Mitglieder einer Basisklasse sind weiterhin privat und für die abgeleitete Klasse nicht zugänglich. Die geschützten Member sind andererseits für die geerbte Klasse zugänglich, sind aber außerhalb der geerbten Klasse immer noch nicht zugänglich.

class B : public A { 
public: 
    void SetBNumbers(int num) { 
     privateNum = num; //compile error, privateNum can only be accessed by members of A, not B 
     protectedNum = num; //this works, as protected members can be accessed by A and B 
    } 
} 

void main() { 
    B classB; 
    classB.publicNum = 1; //valid, inherited public is still public 
    classB.protectedNum = 1; //compile error, can't access protected member 
    classB.privateNum = 1; //compile error, B doesn't know that privateNum exists 
    classB.SetBNumbers(1); //this sets the members not accessible directly 
} 
0

Ja die geschützten Datenelemente in dem Haupt function.But nicht zugreifen können Sie die geschützten Datenelemente in dem Haupt durch die Schaffung Funktion in Abgeleitet Aufruf zugreifen können.

+0

Gibt es nicht schon genug Antworten auf diese Frage? – matsjoyce

Verwandte Themen