Ich dachte, ich verstehe Vererbung, und virtuelle Funktionen und Funktion Überladung, aber ich habe einen Fall, wo etwas über das Zusammenspiel zwischen diesen Funktionen mir entgeht.teilweise Vererbung von überladenen virtuellen Funktionen
Angenommen, ich habe eine einfache Basisklasse bekam eine überladene virtuelle Funktion, und eine zweite Klasse daraus abgeleiteten enthält:
class b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 2; }
};
class d : public b {
public:
virtual int f(int) { return 3; }
};
Beachten Sie, dass die abgeleitete Klasse d
überschreibt nur eine der überladenen virtuellen Funktionen.
kann ich ein Objekt der Klasse d
und rufen f(int)
darauf, kein Problem instanziiert:
d x;
std::cout << x.f(0) << std::endl;
Aber wenn ich versuche, die 0-Argument Funktion aufzurufen:
std::cout << x.f() << std::endl;
es nicht! gcc sagt "keine übereinstimmende Funktion für den Aufruf von 'd :: f()'; Kandidaten sind: virtual int d :: f (int)". clang sagt "zu wenig Argumente um zu funktionieren call, erwartet 1, habe 0; meintest du 'b :: f'?" Auch wenn d
von b
stammt, die eine 0-Argument f()
-Methode hat, ignoriert der Compiler das und versucht stattdessen d
1-Argument-Methode aufzurufen.
Ich kann dieses Problem beheben, indem die Definition der 0-Argument Funktion in der abgeleiteten Klasse zu wiederholen:
class d : public b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 3; }
};
Oder, wie durch Klirren der Fehlermeldung vorgeschlagen, ich doof Begriffsklärung Syntax verwenden kann, den ich nie würde funktionieren würde erraten haben:
std::cout << x.b::f() << std::endl;
Aber meine Frage ist, welche Regel habe ich brechen, und was diese Regel versucht zu erzwingen/schützen/verteidigen? Was ich hier zu tun versuchte, war genau die Art von Sache, für die ich das Erbe hielt.
diese eine sehr gute Diskussion des Themas http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class -Hide-Other-Überlastungen-der- – blade