2012-01-28 19 views
6

No es este código:múltiple virtual de la herencia y el constructor de la clase base llamada

#include <iostream> 

class Bazowa 
{ 
    int x; 
public: 
    Bazowa() : x(55){} 
    Bazowa(int x_) : x(x_) {} 
    void fun() 
    { 
     std::cout << x << "fun\n"; 
    } 
}; 

class Pochodna1 : virtual public Bazowa 
{ 
public: 
    Pochodna1() : Bazowa(101) {} 
}; 

class Pochodna2 : virtual public Bazowa 
{ 
public: 
    Pochodna2() : Bazowa(103) {} 
}; 

class SuperPochodna : public Pochodna1, public Pochodna2 
{ 
public: 
    SuperPochodna() : {} 
}; 


int main() { 
    SuperPochodna sp; 
    sp.fun();  // prints 55fun 

    return 0; 
} 

Después de la ejecución de este programa, se imprimirá "55fun". ¿Qué pasó con las llamadas al constructor en la clase Pochodna1 y Pochodna2? ¿Se ignoran? ¿Por qué el miembro 'x' de la clase Bazowa se establece en '55', pero no '101' o '103'?

Respuesta

9

Los constructores de bases virtuales siempre se invocan desde la clase hoja final. Ninguno de los otros constructores para la base virtual se llama. En su caso SuperPochodna() está llamando al Bazowa() y las llamadas a Bazowa(int) en Pochodna1 y Pochodna2 no se utilizan.

Ver http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14 o simplemente google "virtual base constructor".

+0

El bit relevante en el estándar (en el borrador N3290) es 12.6.2: 10-11, que incluso tiene un ejemplo muy parecido a este. – user450018

Cuestiones relacionadas