2009-08-20 5 views
1

Pourquoi je ne peux pas accéder à un membre de classe de base A dans la liste d'initialisation de classe B?dériver problème sur C++

class A 
    { 
    public: 
     explicit A(int a1):a(a1) 
     { 
     } 
     explicit A() 
     { 
     } 

    public: 
     int a; 

    public: 
     virtual int GetA() 
     { 
      return a; 
     } 
    }; 

    class B : public A 
    { 
    public: 
     explicit B(int a1):a(a1) // wrong!, I have to write a = a1 in {}. or use A(a1) 
     { 
     } 
     int GetA() 
     { 
      return a+1; 
     } 
    }; 

    class C : public A 
    { 
    public: 
     explicit C(int a1):a(a1) 
     { 
     } 
     int GetA() 
     { 
      return a-1; 
     } 
    }; 
+0

J'ai changé le libellé pour que la question soit plus précise: Vous ne pouvez pas accéder à un champ depuis les listes d'initialisation, alors que vous pouvez en effet y accéder depuis le corps du constructeur. –

Répondre

6

constructeur de A court avant B, et, implicitement ou explicitement, l'ancienne construction toutes les instances de A, y compris le membre a. Par conséquent B ne peut pas utiliser un constructeur sur a, parce que ce champ est déjà construit. La notation que vous essayez d'utiliser indique exactement comment utiliser un constructeur sur a, et à ce stade, c'est simplement impossible.

6

Pour construire sur Alex » réponse, vous pouvez initialiser la classe de base membre « a » en contrôlant sa construction, comme ceci:

class B : public A 
{ 
public: 
    explicit B(int a1) : A(a1) { } // This initializes your inherited "a" 
    ... 
}; 

Notez que je suis la construction de la classe de base (capitale "A") au lieu de tenter d'initialiser directement son membre hérité ("a", en tirant de votre exemple).

+0

Un grand merci, pilcrow :) – user25749

0

Pour construire encore plus loin sur la réponse de pied-de-mouche, vous pouvez facilement initialiser le Un membre comme vous voulez qu'elle remplaçant dans votre classe B:

class B : public A 
{ 
public: 
    int a; // override a 

    explicit B(int a1) : a(a1) // works now 
    { 
    } 

    ... 
}; 

Bien, je ne recommanderais pas nécessairement cela;)

+0

Ha! Nouveau badge: "Tour de Babel", pour prolonger une réponse déjà étendue. :) – pilcrow