2011-01-15 6 views
3

Warum funktioniert das nicht, und was wäre eine gute Alternative?C++: Zugang zu Grandparent-Methode

class Grandparent 
{ 
    void DoSomething(int number); 
}; 

class Parent : Grandparent 
{ 
}; 

class Child : Parent 
{ 
    void DoSomething() 
    { 
     Grandparent::DoSomething(10); // Does not work. 
     Parent::DoSomething(10); // Does not work. 
    } 
}; 

Antwort

11
class Grandparent 
{ 
protected: 
    void DoSomething(int number); 
}; 

class Parent : protected Grandparent 
{ 
}; 

class Child : Parent 
{ 
    void DoSomething() 
    { 
     Grandparent::DoSomething(10); //Now it works 
     Parent::DoSomething(10); // Now it works. 
    } 
}; 

Zumindest muss es so aussehen. Bei der Arbeit mit Klassen sind die Voreinstellungen standardmäßig privat, dies gilt auch für Unterklassen.

http://codepad.org/xRhc5ig4

Es ist ein vollständiges Beispiel, das und läuft kompiliert.

+4

Beachten Sie, dass Mitglieder einer 'struct' standardmäßig öffentlich sind. Der einzige Unterschied zwischen einer "class" und einer "struct" besteht darin, dass "class" -Mitglieder standardmäßig privat und "struct" -Mitglieder standardmäßig öffentlich sind. –

+0

Bearbeitet, um zu klären, danke für die Erinnerung. –

+0

yeah, ich hatte gerade das OP repariert, und ich habe gerade mein Beispiel kompiliert und es funktioniert ... Ich muss schauen, was ich in meinem Code falsch mache. Vielen Dank. –

0

Ich vermute, dass Sie Code nicht kompiliert haben - und die Hauptquelle des Fehlers fehlte Rückgabetyp Spezifizierer für Methode Child::DoSomething().

+0

nein, das war nicht das Problem. Ich habe es im Beispiel einfach ausgelassen. –

+0

@Jay Ok, das habe ich am Anfang gesehen. Die nächste Fehlerquelle besteht in der Tatsache, dass die öffentliche Vererbung die privaten Mitglieder des Elternteils in der Klasse des Kindes verbirgt, so dass Sie die Zugriffsebene im Elternteil erhöhen müssen - wie in Joshuas Antwort –

+0

meinst du nicht private Vererbung? –