2010-10-31 27 views
6

Dire che ho una classe di base:Non chiamare costruttore della classe base dalla classe derivata

class baseClass 
{ 
    public: 
baseClass() { }; 

}; 

E una classe derivata:

class derClass : public baseClass 
    { 
     public: 
    derClass() { }; 

    }; 

Quando creo un'istanza derClass costruttore di baseClass si chiama . Come posso evitare questo?

+1

Non è così; questo non ha senso Perché pensi di doverlo fare? – GManNickG

+0

@GMan I ha una classe base in cui i dati vengono preparati con un'intestazione nel costruttore. La classe derivata non ha bisogno di un'intestazione preparata, ma chiama il costruttore della classe base che sta preparando un'intestazione e incasina alcune cose. – Brad

+3

Ti manca il punto di ereditarietà. L'ereditarietà forma una relazione "a A is a B". Se una B fa cose che una A non dovrebbe fare, allora una A non è una B. –

risposta

3

Un'istanza di classe base è una parte integrante di qualsiasi istanza di classe derivata. Se si costruisce un'istanza di classe derivata è necessario, per definizione, costruire tutti gli oggetti di classe e membro di base altrimenti la costruzione dell'oggetto derivato non avrebbe avuto esito positivo. La costruzione di un'istanza di classe base comporta la chiamata a uno dei suoi costruttori.

Questo è fondamentale per il modo in cui l'ereditarietà funziona in C++.

11

Rendere il ctor vuoto aggiuntivo.

struct noprapere_tag {}; 

class baseClass 
{ 
public: 
    baseClass() : x (5), y(6) { }; 

    baseClass(noprapere_tag) { }; // nothing to do 

protected: 
    int x; 
    int y; 

}; 

class derClass : public baseClass 
{ 
public: 
    derClass() : baseClass (noprapere_tag) { }; 

}; 
Problemi correlati