2012-03-16 14 views
7

Soy un estudiante de primer año en C++, especialmente sobre programación orientada a objetos. Y ahora tengo un problema durante mi aprendizaje.Orden de constructor en la herencia virtual

Hay una jerarquía de clases siguientes:

class Class{}; 

class Base:public Class{}; 

class Derived1:virtual public Base{}; 

class Derived2:virtual public Base{}; 

class MI:public Derived1,public Derived2{}; 

class Final:public MI,public Class{}; 

y ahora quiero saber cuál es el orden del constructor para la definición de un objeto de clase final es.

Dibujo un diagrama: enter image description here structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg

sé clases base virtuales se construyen siempre antes de la base de clases no virtual, independientemente de si aparecen en la jerarquía de herencia. Lo que estoy confundido es que si el constructor de la clase Class está antes de Base, y si el constructor de Class se invoca dos veces. ¿Y por qué?

¿Alguien me puede decir la respuesta? Cuanto más detallado mejor.

+7

Es bastante fácil de entender de una manera perezosa. Construye un programa. Ponga instrucciones de depout cout en cada uno de sus constructores (.e.g "¡Soy Constructor Base!"). Observe el orden de construcción siguiendo las instrucciones cout. –

+3

advertencia: base directa 'Clase' inaccesible en 'Final' debido a la ambigüedad –

+0

@ 0A0D: Por supuesto, eso solo le dice cómo el compilador actual puede implementarlo. Eso puede ser lo suficientemente bueno para ti, pero tal vez no lo sea. :) –

Respuesta

8

La herencia directa de Class por Final y Base no es virtual, por lo que una instancia de Final tiene dos subobjetos clase base de tipo Class. El que es la base directa de Base se construye antes de Base, y el que es la base directa de Final se construye después (de hecho después de MI).

La razón es que:

  1. bases directas se construyen en el orden en que se enumeran (a menos que sean una base virtual que ha sido ya construido),
  2. bases están construidos antes de la clase de propio constructor se ejecuta.

La aplicación de (1) a Final nos dice que Class se construye después MI. Al aplicar (2) varias veces, nos dice que Class está construido antes de Base, antes de Derived1 y Derived2, antes que MI.

Cuestiones relacionadas