Dies ist die code:Warum kann eine abgeleitete Klasse nicht über einen Zeiger auf Base auf ein geschütztes Member ihrer Basisklasse zugreifen?
class TestA
{
protected:
int test=12;
public:
TestA() {
cout << "test a: " << test << endl;
}
~TestA() {
}
};
class TestB : public TestA
{
public:
TestB(TestA *testA) {
cout << "test b: " << testA->test;
}
~TestB() {
}
};
int main()
{
TestA *pTestA=new TestA();
TestB *pTestB=new TestB(pTestA);
}
Ich bin für den Zugriff von einem protected
Mitglied versucht, einen Zeiger mit deutet auf ein TestA
Typ Objekt (also eine Instanz von TestA
). TestB
ist auch abgeleitet von TestA
Warum kann ich nicht darauf zugreifen? Ist es nur "innerhalb" der Klasse zugänglich, wo ich es brauche? Nicht außerhalb mit Zeiger/direkte Deklarationen?
Ich bin Wiedereröffnung diese Frage als die hier erwähnten Antwort ist besser als das ältere Duplikat: (http [ein geschütztes Mitglied einer Basisklasse in einer anderen Unterklasse zugreifen]: // stackoverflow.com/q/11631777/514235). Den anderen schließen. – iammilind
Kurze Antwort: Weil der Standard sagt, das ist verboten. Dementsprechend werden standardkonforme Compiler einen Fehler ausgeben. YMMV, aber ich würde das eigentlich einen Fehler im Standard nennen. – cmaster
@cmaster (Siehe den Beispielcode in meiner Antwort) Wenn es erlaubt ist, ist es möglich, auf die geschützten Mitglieder über einen Zeiger vom Typ "B *" zuzugreifen, der auf eine Instanz von "D1" in der Mitgliedsfunktion von "D2" zeigt. Aber "D1" und "D2" sind in der Tat irrelevant. Es scheint nicht intuitiv zu sein. – songyuanyao