2010-11-01 3 views
5

La mia domanda verrà probabilmente spiegata meglio da un esempio.Chiamare una funzione sottoposta a override da una classe base?

Ad esempio, ho 2 classi: Una classe base e la classe derivata:

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

}; 

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

}; 

Quando creo un'istanza derivedClass, il costruttore in baseClass sarà chiamato, e foo() chiamerò dalla sua costruttore. Il problema è che il costruttore di baseClass sta chiamando il proprio foo() e non lo ha sostituito con lo foo() che la classe derivata ha sovrascritto. Esiste comunque la possibilità che la baseClass chiami la funzione sovrascritta, non la sua definizione della funzione?

risposta

17

Non chiamare un metodo virtuale da un costruttore perché l'oggetto non è stato ancora completamente creato. Essenzialmente, la classe derivata non esiste ancora, quindi i suoi metodi non possono essere chiamati.

+0

+1: i costruttori sono speciali e astuti;) – James

+0

Grazie per la risposta! Mi sento un idiota ora perché avrei dovuto saperlo già. Grazie:] – Brad

+2

di modi per fare qualcosa di simile accada, vedi C++ FAQ Lite 23.6: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6 – aschepler

0

Nella maggior parte delle lingue, questo comportamento è vietato o non definito, a ragione.

Si consideri questo: il costruttore della classe base viene eseguito prima del costruttore della sottoclasse, quindi eventuali vars definiti dal sottopassaggio non saranno inizializzati. Sei sicuro di voler chiamare il metodo sottoclasse in queste circostanze?

L'alternativa più semplice è definire un metodo initialize() nella tua superclasse, quindi ricordarsi di chiamare initialize() dal costruttore della sottoclasse.