Ändern des Funktionszugriffsmodus in der abgeleiteten Klasse
Betrachten Sie den folgenden Codeausschnitt:
struct Base
{
virtual ~Base() {}
virtual void Foo() const = 0; //Public
};
class Child : public Base
{
virtual void Foo() const {} //Private
};
int main()
{
Child child;
child.Foo(); //Won't work. Foo is private in this context.
static_cast<Base&> (child).Foo(); //Okay. Foo is public in this context.
}
Ist das legal C++? "Diese" änderung der virtuellen Funktion die access mode in der abgeleiteten Klasse.
InformationsquelleAutor der Frage hlx236sk | 2010-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ändern des Zugriffsmodus in abgeleiteten Klassen ist legal.
Dies ist ähnliche in form, aber verschiedenen in Absicht auf die Nicht-Virtuelle Schnittstelle idiom. Einige Gründe gegeben hier:
Warum würden Sie eigentlich machen, etwas
public
in der Basis aberprivate
im abgeleitet, ohneprivate
oderprotected
Vererbung ist mir schleierhaft.InformationsquelleAutor der Antwort MSN
Dies legal ist, C++, §11.6/1 sagt:
Als Sie merkte,
Child::Foo()
ist somit immer noch zugänglich über die Basisklasse, die in den meisten Fällen unerwünschte:Grundsätzlich die Erklärung, die Sie finden in der expression bestimmt die access - Modus- aber virtuelle Funktionen untergraben, als eine andere Funktion, die dann den Namen kann man tatsächlich aufgerufen werden.
InformationsquelleAutor der Antwort Georg Fritzsche
Es ist völlig legal in C++. Sie sind einfach die Definition einer neuen Methode in der Child-Klasse.
Nun tut es das, was Sie wollen, es zu tun, das ist eine andere Frage.
Ich glaube, dass die access-Modus ist nicht Teil der Signatur der Methode, was bedeutet, dass der Aufruf Base ist Foo virtuelle Methode wird schließlich rufen Kindes Foo-Methode.
So, hier ist das Fazit : es legal ist c++ und es funktioniert, wie Sie es erwarten.
Ich bin nicht unter Berücksichtigung der Linie
child.Foo();
was nicht funktionieren kann, denn es ist kein Zweifel, es ist zu versuchen, um Zugriff auf die Untergeordneten private Foo () - Methode.InformationsquelleAutor der Antwort Benoît
Scheint es zu kompilieren, und nennen Sie die richtige Methode.
Denken Sie daran, dass Zugriffsbezeichner sind da, um zu helfen, ein Programmierer diszipliniert, nicht zu verhindern, alle versuche, es zu umgehen, was das kostet.
In diesem speziellen Fall, ein Kind hat kein Geschäft machen, die überschriebene virtuelle Funktion private: ist nicht es soll zur Implementierung der öffentlichen Schnittstelle der Basis, also den "ist-ein" Beziehung hält? (Wenn Sie nicht mit öffentlicher Vererbung, was bedeutet "Kind " Base", Ihr trick nicht funktionieren würde.)
InformationsquelleAutor der Antwort UncleBens