2011-08-16 19 views
5

Aquí http://www.parashift.com/c++-faq-lite/multiple-inheritance.html sección [25,14] diceHerencia jerarquía: constructor y destructor secuencia de ejecución

Los primeros constructores a ejecutar son las clases base virtuales en cualquier lugar en la jerarquía.

Traté de verificar que el uso siguiente programa:

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

cada clase tiene una c'tor y virtual d'tor. la salida es el siguiente:

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

pero según cotización clases base virtual de constructores debe ejecutarse en primer lugar.

¿Qué entendí mal?

EDIT: Para aclarar mi pregunta, según mi entender, este comportamiento no tiene nada que ver con si una clase base es virtual o no. pero la cita insiste en Clase base virtual. ¿estoy claro o algo sospechoso allí?

Gracias.

+0

ingrese el código que estaba utilizando para obtener respuestas más precisas. – amit

+0

@amit, no necesita código aquí. Este comportamiento se espera ... – eran

Respuesta

3

Las clases base virtuales no se pueden construir si las clases de las que heredan no se construyen primero. Por lo tanto, en su caso, las clases base no virtuales se construyen porque las virtuales dependen de ellas: C no se pueden construir hasta que A y B sean. Por lo tanto, A y B están construidos antes de C, aunque C prácticamente se hereda.

+1

Eso está en cualquier escena. ¿Por qué esta frase se agrega 'en cualquier lugar de la jerarquía'? – Azodious

+1

@Azodious, C++ FAQ es fantástico, pero supongo que en este caso la falta de más explicaciones podría ser engañosa. Las clases base virtuales se construyen primero en cualquier lugar, pero construirlas implica construir sus bases, como en cualquier escenario. No hay otra forma de que funcione, ya que las clases tienen que poder confiar en que sus bases se inicialicen. – eran

+0

Ok ... eso lo borra. Gracias. – Azodious

Cuestiones relacionadas