c++ - significado - sobrecargar==
C++ problema con la sobrecarga de funciones en una clase heredada (4)
Posiblemente sea una pregunta novato, lo siento. Me enfrenté a un problema raro recientemente cuando trataba de meterme con algunas cosas de alto nivel en C ++, sobrecarga de funciones y herencia.
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 tener dos func(..)
funciones, sobrecargadas debido a diferentes argumentos.
Pero al probar 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 clase classA
, clase classA
, no es visible en la clase derivada, clase classB
¿Cómo puedo superar esto? ¿no es así cómo funciona la sobrecarga en c ++? Soy nuevo en c ++ pero en Java, sé que puedo hacer uso de algo como esto.
Aunque ya encontré este hilo que pregunta sobre un problema similar, creo que los dos casos son diferentes.
Debe pasar el argumento de tipo int en
objB.func(b); //here''s the problem!
bcs se ha sobrecargado con argumento int
Está bien explicado, por ejemplo, en las respuestas de esta pregunta:
¿Por qué debería usar la palabra clave "usar" para acceder a mi método de clase base?
En resumen, el compilador dejará de buscar métodos de concordancia de las clases principales, cuando encuentre el nombre del método correspondiente en la clase actual, incluso cuando ese método no sea compatible. Supongo que esto permite que algunas conversiones de tipo automáticas funcionen de manera más lógica, sin necesidad de anular tantos métodos de clase primaria.
Si anula una variante de una función en la clase derivada, debe anular 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 misma clase 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);
}
Todo lo que necesitas es using
:
class classB:public classA{
public:
using classA::func;
void func(int){};
};
No busca en la clase base la func
porque ya encontró una en la clase derivada. La instrucción using
coloca la otra sobrecarga en el mismo ámbito para que pueda participar en la resolución de sobrecarga.