2010-11-01 26 views
5

Mi pregunta probablemente será mejor explicada por un ejemplo.¿Llamar a una función anulada de una clase base?

Por ejemplo, tengo 2 clases: Una clase base y una clase derivada:

class baseClass 
{ 
public: 
    baseClass() 
    { 
     foo(); 
    } 
    virtual bool foo() { printf("baseClass"); return false;} 

}; 

class derivedClass : public baseClass 
{ 
public: 
    bool foo() 
    { 
     printf("derivedClass"); 
     return true; 
    } 

}; 

Cuando creo una instancia de derivedClass, el constructor en baseClass será llamado, y foo() serán llamados de que es constructor. El problema es que el constructor baseClass está llamando a su propio foo() y no a la foo() reemplazada que la clase derivada ha anulado. ¿Hay alguna forma de hacer que la clase baseClass invoque la función anulada, no su propia definición de la función?

Respuesta

17

No debe llamar a un método virtual desde un constructor porque el objeto aún no se ha construido por completo. Básicamente, la clase derivada aún no existe, por lo que no se pueden llamar sus métodos.

+0

+1: Los constructores son especiales y trucos;; – James

+0

¡Gracias por la respuesta! Me siento como un idiota ahora porque ya debería haberlo sabido. Gracias:] – Brad

+2

Para formas de hacer que algo similar suceda, vea C++ FAQ Lite 23.6: http://www.parashift.com/c++faq-lite/strange-inheritance.html#faq-23.6 – aschepler

0

En la mayoría de los idiomas, este comportamiento está prohibido o indefinido, con buenas razones.

Considere esto: el constructor de la clase base se ejecuta antes del constructor de la subclase, por lo que cualquier vars definido por la subclase no se inicializará. ¿Estás seguro de que quieres llamar al método subclasificado en esas circunstancias?

La alternativa más simple es definir un método initialize() en su superclase, entonces simplemente recuerde llamar a initialize() desde su constructor de subclase.

Cuestiones relacionadas