2009-01-25 17 views
7

Ich kann geschützte Funktion in meiner Basisklasse nicht aufrufen. Warum? Es sieht etwa so aus:kann nicht Basisklasse geschützte Funktionen aufrufen?

class B : B2 
{ 
public: 
    virtual f1(B*)=0; 
protected: 
    virtual f2(B*) { codehere(); } 
} 
class D : public B 
{ 
public: 
    virtual f1(B*b) { return f2(b); } 
protected: 
    virtual f2(B*b) { return b->f2(this); } 
} 

In msvc ich den Fehler Fehler C2248 erhalten: 'name :: Klasse :: f2': kann nicht geschützte Mitglied in der Klasse deklariert Zugriff 'name :: class'

In gcc Ich bekomme einen Fehler: 'virtual int name :: class :: f2()' ist geschützt.

Warum ist das? Ich dachte, der Punkt geschützter Member ist, dass abgeleitete Klassen aufgerufen werden.

+0

Zumindest fügen Sie Code hinzu, der die Fehler kompiliert und generiert, die Sie beheben möchten. Der obige Code weist so viele andere Syntaxfehler auf, dass die Lösung Ihres Problems unwiderruflich wird. –

+0

ich stimme mit martin überein. Wenn Sie möchten, dass wir Ihnen helfen, investieren Sie einige Zeit in Ihren Code C++ (ohne Rückgabetypen, Semikolons und andere Sachen) –

Antwort

15

Geschützte Memberfunktionen können nur innerhalb der Basisklasse oder in ihrer abgeleiteten Klasse aufgerufen werden. Sie können sie nicht außerhalb Ihrer Klasse anrufen. Outside Calling bedeutet, eine Member-Funktion einer klassenvariablen Variable aufzurufen.

So

virtual f1(B*b) { return f2(b); } 

ist in Ordnung, da f2 auf die Klasse selbst arbeitet. (Genannt nach innen)

Aber

virtual f2(B*b) { return b->f2(this); } 

wird nicht kompiliert, da f2 auf b arbeitet selbst nicht die Klasse D. (draußen genannt) Es ist illegal.

Um es zu beheben, sollte B :: f2 öffentlich sein.

+0

Frage, gibt es einen Weg um dies, ich komme aus der verwalteten Welt, wo dies erlaubt ist und ich Ich finde es sehr nützlich, ich möchte diese privaten Dinge nicht nur intern machen, aber wenn es keinen Weg gibt, muss ich es auch tun. Ist es möglich, die Klasse zu einem Freund ihrer selbst zu machen? –

+0

John, mach entweder f2 öffentlich oder erkläre, D sei ein Freund von B. Mir ist nichts anderes bekannt. – OldPeculier

Verwandte Themen