2016-12-26 1 views
1

Ich habe festgestellt, dass ich eine Menge Code in meiner Vererbungshierarchie wiederverwenden, und ich frage mich, ob es keinen besseren Weg gibt. Ich habe eine Item-Klasse, von denen viele anderen Arten von Artikeln erben können:Wie Standardverhalten für eine abgeleitete Klasse anstelle neu zu definieren Konstruktor

struct Item{ 
    Item(){}; 
    Item(string name) : name(name){} 
    string name; 
}; 

Das ist also eine Klasse, die zur Verfügung gestellt ohne Namen (der Standard) oder ein Namen erstellt werden kann. Alles ist gut. Aber sagen, ich habe eine Klasse von Artikel vererben:

struct Book : Item 
{ 
}; 

Ich kann dann nicht tun:

Book harryPotter("Harry Potter"); 

Wenn ich will, die gleiche Art von Verhalten, wo ich wählen kann eine Zeichenfolge zur Verfügung zu stellen oder nicht ich habe folgendes zu tun:

struct Book : Item 
{ 
    Book(string name) : Item(name) {} // Set the name in base's initialiser list 
    // Or... 
    Book(string name) { this->name = name; } // Set the name in derived's constructor 
}; 

In beiden Fällen muss ich dann einen separaten Standard-Konstruktor schreiben, da der Compiler nicht ein zur Verfügung stellen, wo ich meine eigene Art gemacht haben.

Dann, soweit ich sehen kann, muss dies jedes Mal neu eingegeben werden, wenn ich einen neuen Elementtyp erstelle.

Und ich habe festgestellt, dass dieses Problem auch dann auftritt, wenn ich keinen Standardkonstruktor haben will, wenn ich einen Typ von Item erstellen will, muss ich explizit den Konstruktor für jeden erstellen?

Edit: Dank Sam Varshavchik für diese, ausgehend von C 11 ++ Sie können Konstrukteure erben mit:

using Base::Base; 

Antwort

3
struct Book : Item 
{ 
    using Item::Item; 
}; 

Das wird sich im Wesentlichen wissen, erben alle Item ‚s Bauer in Book.

+0

Wow, ist diese Syntax wieder eine spezielle Ausnahme zum Erben von Konstruktoren? Weil ich mit Item :: Item nur die Zeile nicht verstehen kann; Ich denke, das zweite Element ist der Standardkonstruktor der Basis. Das sind gute Nachrichten, aber verwirrend. Ich werde danach suchen. – Zebrafish

+0

Wow, das ist speziell ein C++ 11 und später Feature. Ich kann nicht verstehen, wie sehr sich diese Sprache in letzter Zeit verändert hat. Gibt es eine Renaissance in C++ oder so? – Zebrafish

+1

C++ hat sich in den letzten sieben Jahren dramatisch verändert. Es ist etwa drei- bis viermal so groß in Bezug auf Funktionalität und Komplexität wie vor sieben Jahren. Es ist gleichzeitig komplexer, aber auch die neue Komplexität macht vieles einfacher als zuvor. So zum Beispiel. –

Verwandte Themen