Hier ist ein Beispiel für Code, der mich nervt:
%Vor%Wie greifen Sie auf die geschützte übergeordnete Funktion zu?
Danke für Ihre Hilfe. : o)
Auf geschützte Member in einer Basisklasse kann nur vom aktuellen Objekt zugegriffen werden.
Sie dürfen also this->foo()
aufrufen, aber Sie dürfen this->b->foo()
nicht aufrufen. Dies ist unabhängig davon, ob Derived
eine Implementierung für foo
bereitstellt oder nicht.
Der Grund für diese Einschränkung ist, dass sonst der geschützte Zugriff sehr leicht umgangen werden könnte. Sie erstellen einfach eine Klasse wie Derived
, und plötzlich haben Sie auch Zugriff auf Teile anderer Klassen (wie OtherDerived
), die für Außenstehende nicht zugänglich sein sollten.
Normalerweise würden Sie es mit Base::foo()
machen, was sich auf die Basisklasse der aktuellen Instanz bezieht.
Wenn der Code jedoch so ausgeführt werden muss, wie Sie es versuchen und nicht erlaubt ist, müssen Sie foo () öffentlich machen oder Derived zu einem Freund von Base machen.
Eine Lösung wäre, eine statische geschützte Funktion in Base
zu deklarieren, die den Aufruf an die private / protected-Funktion weiterleitet ( foo
im Beispiel).
Sagen wir:
%Vor% Auf diese Weise wird die Kapselung nicht unterbrochen, da der Designer von Base
eine explizite Auswahl treffen kann, damit alle abgeleiteten Klassen foo
gegenseitig aufrufen können, und dabei foo
nicht in die öffentliche Schnittstelle oder zu setzen explizit alle möglichen Unterklassen von Base
in Freunde verwandeln.
Diese Methode funktioniert auch unabhängig davon, ob foo
virtuell ist oder nicht, oder ob sie privat oder geschützt ist.
Hier ist ein Link zu einer laufenden Version des obigen Codes und hier eine andere Version der gleichen Idee mit ein wenig mehr Geschäftslogik.
Es ist ein wenig zerbrechlich, aber mit den Klassen, die Sie hier definiert haben, wird das nicht funktionieren?
%Vor%Der Ausdruck reinterpret_cast zeigt auf VTABLE für das Basisobjekt und ruft ihn über diesen Member-Accessor auf.
Sie rufen Basisfunktionen explizit mit dem Bereichsoperator (Base :: foo ()) auf. Aber in diesem Fall definiert die Base-Klasse foo nicht (es ist rein virtuell), es gibt also keine Funktion, die ausgeführt werden kann, wenn Sie this->b->foo();
sagen, da b ein Zeiger auf Base und nicht Derived ist.
Wie greifen Sie auf den geschützten Bereich zu? überlagerte Funktion?
--- von wo?
Sie können nur über die Vererbung (abgesehen von den Methoden derselben Klasse) auf ein geschütztes Mitglied zugreifen. Sagen Sie zum Beispiel, Sie haben ein class Derived1
, das von Derived
erbt, dann können Objekte von Derived1
foo()
aufrufen.
BEARBEITEN Sie: MSDN-Artikel zum Zugriffsschutz-Spezifizierer.
Tags und Links c++ protected derived-class