Я заметил, что многократно использую код в моей иерархии наследования, и мне было интересно, если нет лучшего способа. У меня есть класс Item, от которого могут наследоваться многие другие типы элементов:
struct Item{
Item(){};
Item(string name) : name(name){}
string name;
};
Так что это класс, который может быть создан без имени (по умолчанию) или имени. Все хорошо. Но скажем, у меня есть класс, унаследованный от Item:
struct Book : Item
{
};
Я не могу тогда сделать:
Book harryPotter("Harry Potter");
Если я хочу того же типа поведения, где я могу указать строку или нет, я должен сделать следующее:
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
};
В обоих случаях мне нужно написать отдельный конструктор по умолчанию, так как компилятор не предоставит тот, где я создал свой собственный тип.
Затем, насколько я вижу, это нужно будет перепечатывать каждый раз, когда я создаю новый тип элемента.
И я понял, что эта проблема возникает, даже если я не хочу конструктор по умолчанию, если я хочу создать тип Item, я должен явно создать конструктор для каждого из них?
Редактировать: Спасибо Сэму Варшавчику за это, начиная с C ++ 11, вы можете наследовать конструкторы с:
using Base::Base;
struct Book : Item
{
using Item::Item;
};
Это будет, по сути, наследовать все Item
конструкторы в Book
,
Других решений пока нет …