2010-10-31 5 views
6

Dire que j'ai une classe de base:Ne pas appeler constructeur de classe de base de la classe dérivée

class baseClass 
{ 
    public: 
baseClass() { }; 

}; 

Et une classe dérivée:

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

    }; 

Lorsque je crée une instance de derClass le constructeur de baseClass est appelé . Comment puis-je empêcher cela?

+1

Vous ne le faites pas; cela n'a pas de sens. Pourquoi pensez-vous que vous devez faire cela? – GManNickG

+0

@GMan J'ai une classe de base où les données sont préparées avec un en-tête dans le constructeur. La classe dérivée n'a pas besoin d'un en-tête préparé, mais elle appelle le constructeur de la classe de base qui prépare un en-tête et salit certaines choses. – Brad

+3

Vous manquez le point de l'héritage. L'héritage forme une relation "un A est un B". Si un B fait des choses qu'un A ne devrait pas faire, alors un A n'est pas un B. –

Répondre

3

Une instance de classe de base fait partie intégrante de toute instance de classe dérivée. Si vous construisez avec succès une instance de classe dérivée, vous devez, par définition, construire tous les objets de classe et de membre de base, sinon la construction de l'objet dérivé aurait échoué. La construction d'une instance de classe de base implique l'appel de l'un de ses constructeurs.

Ceci est fondamental pour le fonctionnement de l'héritage en C++.

11

Créer un ctor vide supplémentaire.

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) { }; 

}; 
Questions connexes