2012-01-28 12 views
6

C'è questo codice:multipla eredità e costruttore di chiamata virtuale di classe di base

#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; 
} 

Dopo l'esecuzione di questo programma, verrà stampata "55fun". Cosa è successo alle chiamate del costruttore in classe Pochodna1 e Pochodna2 - vengono ignorate? Perché il membro 'x' della classe Bazowa è impostato su '55', ma non su '101' o '103'?

risposta

9

I costruttori di basi virtuali vengono sempre chiamati dalla classe foglia finale. Nessuno degli altri costruttori per la base virtuale viene chiamato. Nel tuo caso SuperPochodna() chiama il numero Bazowa() e le chiamate a Bazowa(int) in Pochodna1 e Pochodna2 non vengono utilizzate.

Vedere http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14 o semplicemente google "costruttore di base virtuale".

+0

Il bit pertinente nello standard (nella bozza N3290) è 12.6.2: 10-11, che ha anche un esempio simile a questo. – user450018

Problemi correlati