2011-08-16 19 views
5

Qui http://www.parashift.com/c++-faq-lite/multiple-inheritance.html sezione [25.14] diceEreditarietà gerarchia: Constructor & Destructor sequenza di esecuzione

I primi costruttori da eseguire sono le classi base virtuali ovunque nella gerarchia.

ho provato a verificarlo utilizzando il programma seguente:

  A (pure virtual) 
      | 
      B 
      | 
      C 
(virtual)/ \ (virtual) 
     E  D 
     \ /
      F 
      | 
      G (pure virtual) 
      | 
      H 

ogni classe ha un c'tor e virtuale d'tor. l'output è il seguente:

A 
B 
C 
E 
D 
F 
G 
H 
~H 
~G 
~F 
~D 
~E 
~C 
~B 
~A 
Press any key to continue . . . 

ma come da preventivo i costruttori delle classi di base virtuali devono essere eseguiti per primi.

cosa ho capito in modo errato?

MODIFICA: Per chiarire la mia domanda, Per quanto ne so, questo comportamento non ha nulla a che fare con se una classe base è virtuale o meno. ma la quotazione insiste su Virtual Base class. sono chiaro o qualcosa di strano lì?

Grazie.

+0

si prega di fornire il codice che stavi usando per risposte più precise. – amit

+0

@amit, non c'è bisogno di codice qui. Questo comportamento è previsto ... – eran

risposta

3

Le classi di base virtuali non possono essere costruite se le classi da esse ereditate non sono costruite per prime. Quindi nel tuo caso, le classi di base non virtuali sono costruite perché quelle virtuali dipendono da loro: C non può essere costruito fino a A e B. Pertanto, A e B sono effettivamente costruiti prima dello C, anche se lo C è praticamente ereditato.

+1

Questo è in ogni scenerio. perché questa frase viene aggiunta "ovunque nella gerarchia"? – Azodious

+1

@Azodious, le domande frequenti su C++ sono fantastiche, ma immagino che in questo caso la mancanza di ulteriori spiegazioni potrebbe essere in qualche modo fuorviante. Le classi base virtuali sono costruite dappertutto ovunque, ma la loro costruzione implica la costruzione delle loro basi, come in qualsiasi scenario. Nessun altro modo per farlo funzionare, poiché le classi devono essere in grado di fare affidamento sul fatto che le loro basi vengano inizializzate. – eran

+0

Ok ... questo lo cancella. Grazie. – Azodious

Problemi correlati