Wie rufe ich die übergeordnete Funktion aus einer abgeleiteten Klasse mit C ++ auf? Zum Beispiel habe ich eine Klasse namens parent
und eine Klasse namens, child
die vom Elternteil abgeleitet ist. Innerhalb jeder Klasse gibt es eine print
Funktion. Bei der Definition der Druckfunktion des Kindes möchte ich die Druckfunktion der Eltern anrufen. Wie würde ich das machen?
c++
oop
inheritance
IaCoder
quelle
quelle
Antworten:
Ich gehe das Risiko ein, das Offensichtliche zu sagen: Sie rufen die Funktion auf, wenn sie in der Basisklasse definiert ist, ist sie automatisch in der abgeleiteten Klasse verfügbar (sofern dies nicht der Fall ist
private
).Wenn die abgeleitete Klasse eine Funktion mit derselben Signatur enthält, können Sie sie eindeutig unterscheiden, indem Sie den Namen der Basisklasse gefolgt von zwei Doppelpunkten hinzufügen
base_class::foo(...)
. Sie sollten beachten, dass C ++ im Gegensatz zu Java und C # kein Schlüsselwort für "die Basisklasse" (super
oderbase
) hat, da C ++ Mehrfachvererbung unterstützt, was zu Mehrdeutigkeiten führen kann.Im Übrigen können Sie nicht zweimal direkt von derselben Klasse ableiten, da es keine Möglichkeit gibt, auf eine der Basisklassen über die andere zu verweisen.
quelle
template<class A, class B> class C: public A, public B {};
können zwei Typen aus Gründen, die davon abhängen, wie Ihr Code verwendet wird (das macht A und B gleich), zwei oder drei sein Abstraktionsschicht Weg von jemandem, der nicht weiß, was Sie getan haben.using namespace std
.Wenn die übergeordnete Klasse
Parent
und die untergeordnete Klasse benannt sindChild
, können Sie Folgendes tun:Beachten Sie, dass dies
Parent
der tatsächliche Name der Klasse und kein Schlüsselwort ist.quelle
foo()
hier analogprint()
oder eine separate Funktion? Und meinen Sie damit, dass Sie dieprivate
Vererbung verwenden, um von der Basis geerbte Details auszublenden undpublic
Schattenfunktionen für Dinge bereitzustellen , die Sie verfügbar machen möchten?foo()
war analog zuprint()
. Lassen Sie mich wieder auf die Verwendung zurückkommen,print()
da ich denke, dass dies in diesem Zusammenhang sinnvoller wäre. Angenommen, jemand hat eine Klasse erstellt, die eine Reihe von Operationen für einen bestimmten Datentyp ausgeführt, einige Accessoren verfügbar gemacht und eineprint(obj&)
Methode verwendet hat. Ich brauche eine neue Klasse, die funktioniert,array-of-obj
aber alles andere ist gleich. Die Komposition führt zu viel dupliziertem Code. Die Vererbung minimiert dies beimprint(array-of-obj&)
Schleifenaufrufprint(obj&)
, möchte aber nicht, dass Clients anrufen,print(obj&)
da dies für sie keinen SinnWenn Ihre Basisklasse aufgerufen
Base
wird und Ihre Funktion aufgerufen wirdFooBar()
, können Sie sie direkt mit aufrufenBase::FooBar()
quelle
In MSVC gibt es dafür ein Microsoft-spezifisches Schlüsselwort: __super
MSDN: Hier können Sie explizit angeben, dass Sie eine Basisklassenimplementierung für eine Funktion aufrufen, die Sie überschreiben.
quelle
typdef
die Eltern als so etwas zu betrachtensuper
.__super
; Ich habe es hier als alternativen Vorschlag erwähnt. Entwickler sollten ihren Compiler kennen und die Vor- und Nachteile seiner Funktionen verstehen.Wenn der Zugriffsmodifikator der Basisklassenmitgliedsfunktion geschützt ODER öffentlich ist, können Sie die Mitgliedsfunktion der Basisklasse aus der abgeleiteten Klasse aufrufen. Der Aufruf der nicht-virtuellen und virtuellen Elementfunktion der Basisklasse von der abgeleiteten Elementfunktion kann erfolgen. Bitte beziehen Sie sich auf das Programm.
Ausgabe:
quelle
virtual
!Rufen Sie die übergeordnete Methode mit dem übergeordneten Bereichsauflösungsoperator auf.
quelle
Referenzbeispiel.
quelle