2012-08-29 16 views
8

tengo:C++: Cómo llamar a una función de la clase padre desde fuera

class A{ 
    public: 
     virtual void foo(); 
}; 

class B : public A{ 
    public: 
     void foo(); 
}; 

B *ptr = new B(); 

que desea llamar a un de foo() directamente utilizando el puntero 'PTR'.

Cuando intento

(A*)ptr->foo(); 

que todavía llama a la versión de B de foo(). ¿Cómo llamo a la versión de A en su lugar?

¿Esto es posible? ¿Cuáles son las alternativas? Gracias.

+0

Eche un vistazo a http://en.wikipedia.org/wiki/Scope_resolution_operator – Pramod

+0

¿Puede aclarar qué quiere decir con "no funcionó"? ¿Qué sucede exactamente cuando pruebas el código anterior? –

+3

Hacer esto completamente anula el propósito de hacer que una función sea virtual, por lo que significa que el usuario de la clase 'A 'está evadiendo la intención del diseñador de la clase. Esto probablemente significa que hay un error de diseño en alguna parte: o bien 'A' no proporciona toda la funcionalidad que se necesita, o el usuario de 'A' no entiende lo que 'A 'debe hacer. –

Respuesta

18

Cuando nombra una función con el formulario de resolución de alcance ::, llama a la función nombrada, como si no fuera virtual.

ptr->A::foo(); 
+3

+1. Eso es correcto, aunque sería mejor si también habla sobre el tema de la accesibilidad en el código del OP. – Nawaz

+3

@Nawaz: Y aún mejor si también se menciona el hecho de que esto rompe todos los principios de OO :) Al usuario de 'B' no debería importarle qué versión de' foo' se llame, ese es el punto principal del polimorfismo. –

2

Es necesario que haga sus funciones públicas. Esto se hace simplemente por hacer el siguiente cambio:

class A{ 
    public: 
     virtual void foo(); 
}; 

class B : public A{ 
    public: 
     void foo(); 
}; 

Cuando no se hace esto, las funciones son automáticamente privada e inaccesible desde el "exterior".

+0

Son públicos, simplemente no especifiqué eso en el ejemplo. – nahpr

+4

@nahpr Para referencia futura, sugiero que haga un esfuerzo concienzudo para no introducir errores adicionales en el código que publica aquí. Esto ayudará a evitar perder el tiempo ordenando respuestas inútiles. –

Cuestiones relacionadas