Surcharge la fonction de super classe
-
15-10-2019 - |
Question
Y at-il quelque chose dans la norme C ++ qui me empêche de surcharger la fonction d'une super-classe?
A partir de cette paire de classes:
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
};
Je peux appeler B::foo()
facilement:
B b;
b.foo (1, 2); // [1]
Mais si je tente d'appeler A::foo()
...
B b;
b.foo (12); // [2]
... Je reçois une erreur de compilation:
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)
Juste pour vous assurer que je ne manque quelque chose, je l'ai changé le nom de la fonction de B
afin qu'il n'y ait pas de surcharge:
class B : public A {
int x2;
public:
void stuff (int y, int z) {x2 = y + z;} // unique name
};
Et maintenant je peux appeler A::foo()
en utilisant le second exemple.
est cette norme? J'utilise g ++.
La solution
Vous devez utiliser une déclaration à l'aide dans la définition de la classe B
:
class B : public A {
public:
using A::foo; // allow A::foo to be found
void foo(int, int);
// etc.
};
Sans la déclaration à l'aide, les trouvailles du compilateur B::foo
lors de la recherche de nom et ne efficacement les classes recherche pas de base pour d'autres entités du même nom, donc A::foo
ne se trouve pas.
Autres conseils
Vous n'êtes pas primordial la mise en œuvre de A::foo(int)
, au lieu que vous aliasing A::foo
et changer sa signature (int, int) au lieu de (int). Comme James McNellis mentionné la déclaration de using A::foo;
rend la fonction de A disponible.