problema de c++ con sobrecarga de funciones en una clase heredada
Esta es posiblemente una pregunta noob, lo siento por eso. Me enfrenté a un problema extraño recientemente al tratar de perder el tiempo con algunas cosas de alto nivel en c++, sobrecarga de funciones y herencia.
Voy a mostrar un ejemplo simple, solo para demostrar el problema;
Hay dos clases, classA
y classB
, como a continuación;
class classA{
public:
void func(char[]){};
};
class classB:public classA{
public:
void func(int){};
};
De acuerdo con lo que sé classB
ahora debería poseer dos funciones func(..)
, sobrecargadas debido a diferentes argumentos.
Pero al intentar esto en el método principal;
int main(){
int a;
char b[20];
classB objB;
objB.func(a); //this one is fine
objB.func(b); //here's the problem!
return 0;
}
Da errores como el método void func(char[]){};
que está en la super clase, classA
, no es visible en la clase derivada, classB
.
¿Cómo puedo superar esto? ¿no es así como funciona la sobrecarga en c++? Soy nuevo en c++ pero en Java, sé que puedo hacer uso de algo como esto.
Aunque ya he encontrado este hilo que pregunta sobre problemas similares, creo que los dos casos son diferentes.
4 answers
Todo lo que necesitas es un using
:
class classB:public classA{
public:
using classA::func;
void func(int){};
};
No busca en la clase base func
porque ya encontró una en la clase derivada. La instrucción using
lleva la otra sobrecarga al mismo alcance para que pueda participar en la resolución de la sobrecarga.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-08 10:01:33
Está bien explicado, por ejemplo, en las respuestas de esta pregunta:
¿Por qué debería usar la palabra clave "using" para acceder a mi método de clase base?
En resumen, el compilador dejará de buscar métodos coincidentes de las clases principales, cuando encuentre el nombre del método coincidente en la clase actual, incluso cuando ese método no sea compatible. Supongo que esto permite que algunas conversiones automáticas de tipos funcionen de manera más lógica, sin necesidad de anular tantos métodos de clase padre.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:08
Si sobrescribe una variante de una función en la clase derivada, necesita sobreescribir todas las variantes. Puede usar lo que JLledo sugirió o escribir la variante de la función en la clase derivada que simplemente llama a la función de la clase base de la misma firma.
class classA{
public:
void func(char[]){};
};
class classB:public classA{
public:
void func(int){};
void func(char[]){};
};
void classB:func(char[] ch)
{
classA::func(ch);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-10 02:55:00
Debe pasar el argumento de tipo int en
objB.func(b); //here's the problem!
Bcs se ha sobrecargado con el argumento int
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-13 09:10:31