2009-08-20 11 views
1

Warum kann ich nicht zugreifen Basisklasse A ist ein Mitglied in Klasse B Initialisierungsliste?Problem ableiten über 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

Ich habe die Formulierung so geändert, dass die Frage spezifischer ist: Sie können nicht auf ein Feld aus den Initialisierungslisten zugreifen, während Sie tatsächlich über den Konstruktor-Text darauf zugreifen können. –

Antwort

6

A Konstruktor ausgeführt wird, bevor die B und, implizit oder explizit das frühere Konstrukt einem der Instanz alle, einschließlich des a Mitglied. Daher kann B keinen Konstruktor für a verwenden, da dieses Feld bereits konstruiert ist. Die Notation, die Sie verwenden möchten, zeigt genau an, dass Sie einen Konstruktor für a verwenden müssen, und an diesem Punkt ist es einfach unmöglich.

6

auf Alex bauen‘Antwort, können Sie die Basisklasse initialisieren ‚a‘ Mitglied durch seine Konstruktion zu steuern, etwa so:

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

Beachten Sie, dass ich die Basisklasse bin Konstruktion (Kapital "A") oben, anstatt zu versuchen, sein geerbtes Mitglied direkt zu initialisieren (Kleinbuchstaben "a", Zeichnung von Ihrem Beispiel).

+0

Vielen Dank, pilcrow :) – user25749

0

Um noch weiter auf Pilcrow Antwort zu bauen, Sie bequem die Ein Mitglied initialisieren könnten wie Sie durch zwingendes es in der B-Klasse wollen:

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

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

    ... 
}; 

Obwohl, ich würde das nicht unbedingt empfehlen;)

+0

Ha! Neues Abzeichen: "Turm von Babel", zur Erweiterung einer Antwort selbst schon erweitert. :) – pilcrow