multiple - operator c++
¿Por qué debería usar la palabra clave "usar" para acceder a mi método de clase base? (4)
Escribí el siguiente código para explicar mi problema. Si comento la línea 11 (con la palabra clave "using"), el compilador no compila el archivo y muestra este error: invalid conversion from ''char'' to ''const char*''
. Parece que no se ve el método void action(char)
de la clase Parent
en la clase Son
.
¿Por qué el compilador se comporta de esta manera? ¿O he hecho algo mal?
class Parent
{
public:
virtual void action( const char how ){ this->action( &how ); }
virtual void action( const char * how ) = 0;
};
class Son : public Parent
{
public:
using Parent::action; // Why should i write this line?
void action( const char * how ){ printf( "Action: %c/n", *how ); }
};
int main( int argc, char** argv )
{
Son s = Son();
s.action( ''a'' );
return 0;
}
La action
declarada en la clase derivada oculta la action
declarada en la clase base. Si usa action
en un objeto Son
el compilador buscará en los métodos declarados en Son
, buscará una action
llamada y la usará. No continuará la búsqueda en los métodos de la clase base, ya que ya encontró un nombre coincidente.
Entonces ese método no coincide con los parámetros de la llamada y se obtiene un error.
Consulte también las Preguntas frecuentes sobre C ++ para obtener más explicaciones sobre este tema.
Si en una clase derivada se redefine cualquier función sobrecargada, entonces se oculta toda la función sobrecargada en la clase base. Una forma de incluir ambas funcionalidades es evitar la sobrecarga de funciones en las clases. o Puede utilizar la palabra clave, tal como se usa.
Sorprendentemente, este es el comportamiento estándar. Si una clase derivada declara un método con el mismo nombre que un método definido por la clase base, el método de la clase derivada ''oculta la clase base''.
Ver las preguntas frecuentes de C ++
Una nota de precaución: la necesidad de utilizar un "uso" en esta situación es una señal de alerta que su código puede ser confuso para otros desarrolladores (¡después de todo, confundió el compilador!). Es probable que deba cambiar el nombre de uno de los dos métodos para dejar clara la distinción a otros programadores.
Una posibilidad:
void action( const char how )
{
takeAction( &how );
}
void action( const char * how )
{
takeAction(how);
}
virtual void takeAction(const char * how) = 0;