Überlastung der Funktion einer Superklasse
-
15-10-2019 - |
Frage
Gibt es etwas im C ++ - Standard, das mich daran hindert, die Funktion einer Superklasse zu überladen?
Beginnend mit diesem Klassenpaar:
class A { // super class
int x;
public:
void foo (int y) {x = y;} // original definition
};
class B : public A { // derived class
int x2;
public:
void foo (int y, int z) {x2 = y + z;} // overloaded
};
Ich kann anrufen B::foo()
leicht:
B b;
b.foo (1, 2); // [1]
Aber wenn ich versuche anzurufen A::foo()
...
B b;
b.foo (12); // [2]
... Ich bekomme einen Compiler -Fehler:
test.cpp: In function 'void bar()':
test.cpp:18: error: no matching function for call to 'B::foo(int)'
test.cpp:12: note: candidates are: void B::foo(int, int)
Nur um sicherzustellen, dass mir etwas nicht fehlte, habe ich den Namen von geändert B
Die Funktion so, dass es keine Überlastung gibt:
class B : public A {
int x2;
public:
void stuff (int y, int z) {x2 = y + z;} // unique name
};
Und jetzt kann ich anrufen A::foo()
Verwenden des zweiten Beispiels.
Ist das Standard? Ich benutze G ++.
Lösung
Sie müssen eine Verwendung in der Definition der Klasse verwenden B
:
class B : public A {
public:
using A::foo; // allow A::foo to be found
void foo(int, int);
// etc.
};
Ohne die Verwendung der Verwendung findet der Compiler B::foo
Während der Namensuche und effektiv sucht keine Basisklassen für andere Entitäten mit demselben Namen, also A::foo
wurde nicht gefunden.
Andere Tipps
Du bist nicht überschreibend A::foo(int)
Implementierung, stattdessen sind Sie Aliasing A::foo
und seine Signatur in (int, int) anstelle von (int) ändern. Wie James McNellis das erwähnte using A::foo;
Die Deklaration macht die Funktion von einem verfügbaren.