Как использовать поведение по умолчанию для производного класса вместо переопределения конструктора

Я заметил, что многократно использую код в моей иерархии наследования, и мне было интересно, если нет лучшего способа. У меня есть класс 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;

1

Решение

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

Это будет, по сути, наследовать все Itemконструкторы в Book,

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector