tipos sencillo programacion poo polimorfismo multiple herencia ejemplos ejemplo derivada clase c++ oop constructor order multiple-inheritance

c++ - sencillo - Secuencia de llamadas de constructor en herencia mĂșltiple



polimorfismo java (1)

He tratado de encontrar mucho que pasa si solo una clase se convierte en virtual en herencia múltiple . El comportamiento de la llamada de constructor no es claro para mí en este caso. Digamos, por ejemplo, código

#include<iostream> using namespace std; class grand{ public: grand(){cout<<"grandfather"<<endl;} }; class parent1:virtual public grand{ //virtual used only here public: parent1(){cout<<"parent1 "<<endl;} }; class parent2: public grand{ public: parent2(){cout<<"parent2"<<endl;} }; class child:public parent1,public parent2{ public: child(){cout<<"child"<<endl;} }; int main() { child s; return 0; }

La salida de este código viene como

grandfather parent1 grandfather parent2 child

pero en el código de arriba si cambiamos esto

class parent1:virtual public grand{ public: parent1(){cout<<"parent1 "<<endl;} }; class parent2: public grand{ public: parent2(){cout<<"parent2"<<endl;} };

a esto

class parent1:public grand{ //virtual removed from here public: parent1(){cout<<"parent1 "<<endl;} }; class parent2:virtual public grand{ //virtual is added here public: parent2(){cout<<"parent2"<<endl;} };

la salida se muestra como

grandfather grandfather //why parent1 constructor is not called here? parent1 parent2 child

Mi preocupación es ¿por qué parent1 constructor no se llama después de abuelo?


El estándar dice [C ++ 11 sección 12.6.2 / 10] que:

En un constructor no delegante, la inicialización procede en el siguiente orden:

- Primero, y solo para el constructor de la clase más derivada, las clases base virtuales se inicializan en el orden en que aparecen en un cruce de profundidad de izquierda a derecha del gráfico acíclico dirigido de las clases base, donde "de izquierda a right "es el orden de aparición de las clases base en la clase derivada base-especificador-lista.

- Entonces, las clases base directas se inicializan en orden de declaración tal como aparecen en la lista de especificación base (independientemente del orden de los iniciadores de memoria).

- Luego, los miembros de datos no estáticos se inicializan en el orden en que fueron declarados en la definición de la clase (nuevamente, independientemente del orden de los iniciadores de memoria).

- Finalmente, se ejecuta la sentencia compuesta del cuerpo constructor.

Entonces, las clases base virtuales siempre se crean primero ... Esto es realmente importante en el caso del uso compartido de clases base virtuales.