¿El método C ++ solo es visible cuando el objeto se envía a la clase base?

Debe ser algo específico en mi código, que no puedo publicar. Pero tal vez alguien pueda sugerir posibles causas.

Básicamente tengo:

class CParent { public: void doIt(int x); }; class CChild : public CParent { public: void doIt(int x,int y,int z); }; CChild *pChild = ... pChild->doIt(123); //FAILS compiler, no method found CParent *pParent = pChild; pParent->doIt(123); //works fine 

¿Como demonios?

EDITAR: la gente está hablando de sombra / escondite. Pero las dos versiones de Do tienen diferentes números de parámetros. Seguramente eso no puede confundir al comstackdor, las sobrecargas en la clase infantil que posiblemente no se pueden confundir con la versión de la clase padre. ¿Puede?

El error del comstackdor que obtengo es: error C2660: ‘CChild :: doIt’: la función no toma 1 argumento

Has sombreado un método. Por ejemplo:

 struct base { void method(int); void method(float); }; struct derived : base { void method(int); // base::method(int) is not visible. // base::method(float) is not visible. }; 

Puede solucionar esto con una directiva de using :

 class derived : public base { using base::method; // bring all of them in. void method(int); // base::method(int) is not visible. // base::method(float) is visible. }; 

Como pareces insistente sobre la cantidad de parámetros , me ocuparé de eso. Eso no cambia nada. Observar:

 struct base { void method(int){} }; struct derived : base { void method(int,int){} // method(int) is not visible. }; struct derived_fixed : base { using base::method; void method(int,int){} }; int main(void) { { derived d; d.method(1, 2); // will compile d.method(3); // will NOT compile } { derived_fixed d; d.method(1, 2); // will compile d.method(3); // will compile } } 

Seguirá sombreado independientemente de los parámetros o tipos de devolución; es simplemente el nombre que sombrea. using base::; traerá todos los métodos ” ” de la base a la visibilidad.

Estás golpeando un problema clásico. Necesitas using CParent::doIt; en tu clase CChild. Buscaré las preguntas duplicadas.

Editar:

Aquí está mi respuesta a esencialmente la misma pregunta: anulando la función sobrecargada de una base en C ++

Nunca he hecho esto sin tener ese método en la clase base antes. Creo que agregar “usar CLASS :: MÉTODO” en la clase derivada le dará acceso a la otra versión del método sobrecargado.

 class CParent { public: void doIt(int x); }; class CChild : public CParent { public: void doIt(int x,int y,int z); using CParent::doIt; }; 

El problema es que CChild realidad no hereda de CParent .

Y entonces no tiene un método doIt que solo tome un argumento.

Cuando anula una función en la clase derivada, solo esa función en la clase derivada es visible para el usuario de esa clase. La versión de la clase base se oculta.

Por lo tanto, su puntero pChild que llama doIt (int x) fallará ya que está utilizando un puntero de clase derivado para llamar a la función de clase base. El puntero pParent que llama doIt (int x) funcionará ya que está utilizando un puntero de clase base para llamar a la función de clase base. Aunque un puntero padre apunta hacia un objeto secundario (uploaded), el tipo de clase aquí está determinado por la statement del puntero que es un CParent.

Para poder invocar esa función de clase base utilizando el puntero de clase derivado, puede:

  1. Califique el nombre de la clase base en la llamada a la función, como se muestra a continuación:

    pChild->CParent::doIt(123);

  2. Use una directiva using para traer el nombre de la función de la clase base a la clase derivada, como se vio en las publicaciones anteriores.

Entiendo que este comportamiento es para darle flexibilidad para anular el comportamiento del método de clase base en su clase derivada.

Supongamos que tiene una función foo (int) en la clase base y desea cambiar el comportamiento de esta función en su clase derivada. Ahora, si el método de clase base no está oculto por su método de clase derivado (que tiene el mismo prototipo que el método de la clase base), introducirá ambigüedad en la resolución de sobrecarga.

El método en su clase infantil tiene una cantidad de argumentos diferente a la que está tratando de pasar. ¿Podría estar relacionado con eso?