2015-10-06 10 views
5

classi base virtuali vengono inizializzati nella classe più derivata, quindi la mia ipotesi è che ereditare il costruttore della classe di base dovrebbe funzionare così:Ereditare costruttori di classi base virtuali

struct base { 
    base(int) {} 
}; 

struct derived: virtual base { 
    using base::base; 
}; 

derived d(0); 

Tuttavia, questo non riesce a compilare con GCC 5.2.0, che cerca di trovare base::base(), ma funziona bene con Clang 3.6.2. È un bug in GCC?

+3

rilevanti: http://stackoverflow.com/questions/2126522/c-virtual-inheritance – SingerOfTheFall

risposta

5

Si tratta di bug gcc 58751 "[C++ 11] Ereditando costruttori non funzionano correttamente con l'ereditarietà virtuale" (aka: 63339 "utilizzando costruttori" da basi virtuali vengono implicitamente eliminati "):

Dalla descrizione 58751:

Nel documento N2540 si afferma che:

In genere, l'ereditarietà delle definizioni del costruttore per le classi con basi virtuali sarà mal formata, a meno che la base virtuale supporti l'inizializzazione predefinita, o la base virtuale sia una base diretta e denominata come base inoltrata. Allo stesso modo, tutti i membri dei dati e altre basi dirette devono supportare l'inizializzazione predefinita, o qualsiasi tentativo di utilizzare un costruttore ereditario sarà mal formato. Nota: mal formato quando utilizzato, non dichiarato.

Quindi, il caso delle basi virtuali è esplicitamente considerato dal comitato e quindi dovrebbe essere implementato.

Soluzione preso in prestito dal bug report:

struct base { 
    base() = default; // <--- add this 
    base(int) {} 
}; 

Secondo il rapporto bug, in questi casi il costruttore base::base(int) viene chiamato dal costruttore implicitamente generato derived::derived(int).

Ho verificato che your code non viene compilato. Ma lo fa this e chiama il costruttore base::base(int).

+0

Ovviamente questo non funziona se 'base' non può essere costruita in modo predefinito ... Quindi sembra che l'unico modo attorno a questo sta ridefinendo manualmente i costruttori in tutte le classi derivate. –