Initialisieren Sie die geschützten Member des Parents mit der Initialisierungsliste (C ++)
Ist es möglich, die Initialisierung Liste der Kind-Klasse' Konstruktor initialize data members als protected deklariert, in der übergeordneten Klasse? Ich kann nicht ankommen es zu wirken. Ich kann es umgehen, aber es wäre schön, wenn ich nicht zu haben.
Einige Beispiel-code:
class Parent
{
protected:
std::string something;
};
class Child : public Parent
{
private:
Child() : something("Hello, World!")
{
}
};
Wenn ich versuche dies, der compiler sagt mir: "Klasse" Kind " keine Feld mit dem Namen 'etwas'". Ist so etwas möglich? Wenn ja, was ist die syntax?
Vielen Dank!
InformationsquelleAutor der Frage Stephen | 2010-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht möglich, in der Sie beschreiben. Müssen Sie einen Konstruktor (geschützt) an die Basisklasse weiterleiten. So etwas wie:
InformationsquelleAutor der Antwort philsquared
Wenn der compiler kommt über die Initialisierungsliste der abgeleiteten Klasse ein Objekt ist noch nicht gebildet. Die Basisklasse der Konstruktor nicht aufgerufen wurde, bis dann. Erst nach der Basisklassenkonstruktor aufgerufen wurde,
something
Sachen. Daher das problem. Wenn Sie nicht, rufen Sie den Basisklassenkonstruktor explizit, der compiler macht das für Sie (durch die Generierung der entsprechenden trivialen Konstruktor der Basisklasse). Dies bewirkt, dass diesomething
Mitglied werden default-initialisiert.Ab C++0x draft:
InformationsquelleAutor der Antwort dirkgently
Du nicht initialisieren Mitglieder der Elternklasse in der abgeleiteten Klasse der Konstruktor-Initialisierungsliste. Es spielt keine Rolle, ob Sie geschützt sind, öffentlich oder sonst was.
In deinem Beispiel, Mitglied
something
ist MitgliedParent
Klasse, was bedeutet, dass es kann nur initialisiert werden, in der Konstruktor-Initialisierungsliste derParent
Klasse.InformationsquelleAutor der Antwort AnT
Vielleicht können Sie versuchen, es in dieser Weise mit dem Schlüsselwort "using"
InformationsquelleAutor der Antwort Aitor