2015-07-28 5 views
6

C++ Primer (5a edizione) a pagina 629 afferma:Perché una classe con costruttori ereditati ottiene anche un costruttore predefinito sintetizzato?

una classe che contiene solo i costruttori ereditato avrà un costruttore di default sintetizzato.

Qual è il ragionamento alla base di questa regola?

+0

Se si eredita dalla classe costruibile con default, perché la classe derivata non dovrebbe essere anche costruibile in modo predefinito? – melak47

+0

La domanda presuppone che la classe base definisca solo costruttori non predefiniti. – AlwaysLearning

risposta

2

Se la classe base non contiene un costruttore senza parametri, il compilatore non sarebbe in grado di generare un costruttore predefinito per la classe derivata perché ha bisogno degli argomenti mancanti per i costruttori della classe base. Tuttavia, se la classe base contiene un costruttore predefinito o un costruttore che non accetta alcun parametro, è possibile generare un costruttore predefinito per la classe derivata con il solito scopo di chiamare i costruttori delle variabili membro. Lo scopo è la comodità di non scrivere autonomamente un costruttore vuoto se il costruttore non fa nulla di speciale.

6

Penso che la citazione possa essere un sospetto. Di seguito, per esempio, non verrà compilato:

struct Base{ 
    Base(int){} 
}; 

struct Derived : Base{ 
    using Base::Base; 
}; 

int main() 
{ 
    Derived d; // error: Derived has no public default ctor!!! 
} 

Derivedcontiene costruttori solo ereditato, ma non dispone di un pubblico quello di default! Ho detto pubblico! In realtà, il messaggio di errore da gcc è:

'Derived :: Derivato()' è implicitamente eliminato perché la definizione di default sarebbe mal formati

Quindi, ciò che l'autore vuol dire è che se a Derived classe inherit constructor da una classe Base, verrà fornito un costruttore predefinito per Derived, perché potrebbe essere necessario inizializzare il membro dati Derived inizializzato che non può essere inizializzato dai costruttori ereditati, perché non sanno nemmeno della loro esistenza.

Infine, nel mio esempio il ctor predefinito per Derivato è stato eliminato in modo implicito dal compilatore, perché nessuno lo ha definito esplicitamente. Ma se si aggiunge un ctor predefinito a Base, sarà disponibile il ctor predefinito sintetizzato per Derivato.

+0

Gli altri costruttori ereditati eseguono l'inizializzazione predefinita dei membri dati della classe derivata. Perché un costruttore predefinito ereditato non può fare lo stesso? – AlwaysLearning

+0

@ MeirGoldenberg Hai ragione! E tu mi hai aiutato a capire il punto. Modificherò la mia risposta. –

+0

Vuoi dire che tutti i costruttori ereditati chiamano il costruttore predefinito sintetizzato della classe derivata? Se è così, questo lascia ancora una domanda: poiché il compilatore sa che i membri di dati della classe base saranno inizializzati dai costruttori ereditati, che uso c'è per un costruttore predefinito della classe base? – AlwaysLearning