2017-04-04 2 views
1

Es gibt etwas, das ich über die neue C++ 11-Funktion nicht mit der Vererbung der Basisklasse Konstrukteure verstehen:Wie initialisiert man abgeleitete Klassenmitglieder bei der Verwendung von Konstruktoren von C++ 11?

using BaseClass::BaseClass; 

Ich dachte, das war eine praktische Funktion, aber jetzt habe ich eine abgeleitete Klasse, die zusätzliche hat Mitglieder, und es scheint, dass ich den Konstruktor neu zu schreiben, wenn ich die abgeleitete Klasse Mitglieder initialisieren wollen:

struct BaseClass 
{ 
    BaseClass(char* name, int intVal, float floatVal) : name(name), intVal(intVal), floatVal(floatVal) {} 
    char* name; 
    int intVal; 
    float floatVal; 
}; 

struct DerivedClass : BaseClass 
{ 
    using BaseClass::BaseClass; 
    int additionalMember; 
}; 

muss ich manuell den Konstruktor überschreiben und die Werte an die Basis des Konstruktor, initialisiert dann das weitere Mitglied ?

struct DerivedClass : BaseClass 
    { 
     DerivedClass(char* name, int intVal, float floatVal) : BaseClass(name, intVal, floatVal), additionalMember(7) {} 
     int additionalMember; 
    }; 

Wenn ja, scheint die Verwendung dieser neuen Eigenschaft der Erben Konstruktoren wirklich begrenzt.

Also muss ich die Konstruktoren jedes Mal neu schreiben?

+0

Ja, Sie müssen die Konstruktoren jedes Mal neu schreiben. Genau wie in fast jeder anderen Sprache. Sie können vielleicht mit * aggregate initialization * auskommen, aber das erfordert, dass Sie niemals einen Konstruktor für eine Ihrer Klassen und Unterklassen definieren (was ihn dann implizit deklarieren würde), und das ist möglicherweise keine vernünftige Option für Ihre Anwendungsfall. – Xirema

+0

Was würden Sie erwarten? –

+0

@ n.m. Ich bin neu in dieser Funktion. Ich dachte zuerst, dass es ein ausgezeichnetes Feature ist. Als ich dann auf dieses Problem stieß, dachte ich, dass es wirklich begrenzt ist, da normalerweise beim Erstellen von Unterklassen Features (Member) hinzugefügt werden, die dann initialisiert werden müssen. – Zebrafish

Antwort

2

Sie könnten Standardwert verwenden:

struct DerivedClass : BaseClass 
{ 
    using BaseClass::BaseClass; 
    int additionalMember = 0; 
}; 

Allerdings, wenn Sie den Wert müssen vom Benutzer Ihrer Klasse übergeben Sie den Konstruktor für DerviedClass zu bieten haben.

Verwandte Themen