Wie kann man von der abgeleiteten Klasse auf die geschützte Methode in der Basisklasse zugreifen?

9

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)

    
Bernard Rosset 12.01.2011, 18:23
quelle

6 Antworten

8

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.

    
Bart van Ingen Schenau 12.01.2011, 19:04
quelle
5

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.

    
Jonathan Wood 12.01.2011 18:26
quelle
2

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.

    
Clemens Sielaff 24.10.2016 10:19
quelle
1

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.

    
Anthony Wieser 10.09.2013 09:09
quelle
0

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.

    
Gemini14 12.01.2011 18:31
quelle
0
  

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.

    
yasouser 12.01.2011 18:49
quelle

Tags und Links