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.

Author: Community, 2013-01-08

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.

 44
Author: chris,
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.

 10
Author: hyde,
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);
}
 3
Author: Girish Matti,
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

 -4
Author: ashish raj,
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