Wie rufe ich die übergeordnete Funktion aus einer abgeleiteten Klasse mit C++ auf? Ich habe zum Beispiel eine Klasse namens parent
und eine Klasse namens child
die von der Mutter abgeleitet ist. Innerhalb von jeder Klasse gibt es eine print
Funktion. In der Definition der Druckfunktion des Kindes möchte ich einen Aufruf an die Druckfunktion der Eltern vornehmen. Wie würde ich dies tun?
Antworten
Zu viele Anzeigen?Ich gehe das Risiko ein, das Offensichtliche zu sagen: Sie rufen die Funktion auf, und wenn sie in der Basisklasse definiert ist, ist sie automatisch in der abgeleiteten Klasse verfügbar (es sei denn, sie ist private
).
Wenn es in der abgeleiteten Klasse eine Funktion mit der gleichen Signatur gibt, können Sie sie durch Hinzufügen des Namens der Basisklasse, gefolgt von zwei Doppelpunkten, eindeutig identifizieren base_class::foo(...)
. Sie sollten beachten, dass C++ im Gegensatz zu Java und C# keine no haben ein Schlüsselwort für "die Basisklasse" ( super
o base
), da C++ unterstützt Mehrfachvererbung was zu Zweideutigkeiten führen kann.
class left {
public:
void foo();
};
class right {
public:
void foo();
};
class bottom : public left, public right {
public:
void foo()
{
//base::foo();// ambiguous
left::foo();
right::foo();
// and when foo() is not called for 'this':
bottom b;
b.left::foo(); // calls b.foo() from 'left'
b.right::foo(); // call b.foo() from 'right'
}
};
Übrigens kann man nicht zweimal direkt von der gleichen Klasse ableiten, da es keine Möglichkeit gibt, auf eine der Basisklassen über die andere zu verweisen.
class bottom : public left, public left { // Illegal
};
Angesichts einer übergeordneten Klasse namens Parent
und eine untergeordnete Klasse namens Child
können Sie etwa so vorgehen:
class Parent {
public:
virtual void print(int x);
};
class Child : public Parent {
void print(int x) override;
};
void Parent::print(int x) {
// some default behavior
}
void Child::print(int x) {
// use Parent's print method; implicitly passes 'this' to Parent::print
Parent::print(x);
}
Beachten Sie, dass Parent
ist der eigentliche Name der Klasse und kein Schlüsselwort.
In MSVC gibt es dafür ein Microsoft-spezifisches Schlüsselwort: __super
MSDN: Ermöglicht es Ihnen, explizit anzugeben, dass Sie eine Basisklassenimplementierung für eine Funktion aufrufen, die Sie überschreiben.
// deriv_super.cpp
// compile with: /c
struct B1 {
void mf(int) {}
};
struct B2 {
void mf(short) {}
void mf(char) {}
};
struct D : B1, B2 {
void mf(short) {
__super::mf(1); // Calls B1::mf(int)
__super::mf('s'); // Calls B2::mf(char)
}
};
Aufruf der übergeordneten Methode mit dem Operator zur Auflösung des übergeordneten Bereichs.
Parent::method()
class Primate {
public:
void whatAmI(){
cout << "I am of Primate order";
}
};
class Human : public Primate{
public:
void whatAmI(){
cout << "I am of Human species";
}
void whatIsMyOrder(){
Primate::whatAmI(); // <-- SCOPE RESOLUTION OPERATOR
}
};
- See previous answers
- Weitere Antworten anzeigen