Предпочтительный способ инициализации членов базового класса (c ++) - PullRequest
0 голосов
/ 14 мая 2018

У меня есть базовый класс:

class Base {
protected:
    int m_a;
    virtual void foo() = 0;
}

И производный класс (ы)

class Derived : public Base {
public:
    Derived(int a);
}

Базовый класс является абстрактным, поэтому могут быть созданы только производные классы. Как лучше реализовать производный Ctor?

Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}

Или

Derived::Derived(int a) { m_a = a;}
Base::Base(){}

Лучше ли удалить элемент из конструктора Base, так как он не может быть создан отдельно, ИЛИ оставить его в конструкторе Base, чтобы остаться для него назначением?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я бы предпочел:

Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}

Таким образом, вы сделаете свой код более инкапсулированным, и Base члены позаботятся о его списке инициализации, в конструкторе базового класса может быть больше логики инициализации в зависимости отm_a вместо того, чтобы просто начинать m_a.В этом случае вы передаете начальное значение вашему базовому конструктору, а затем производный класс в его конструкторе имеет инициализированный конструктор базового класса.

Вы должны попытаться передать значения инициализации вашему классу Base, представьте, что у вас есть 5 Derived классов, и вам нужно инициализировать базовый класс на всех ваших производных ctors.

0 голосов
/ 14 мая 2018

Ваше первое решение - дать базовому классу явный конструктор - предпочтительнее в качестве общего шаблона:

  • он избегает других классов, унаследованных от Base, забывая инициализировать m_a. Вместо этого подпись класса указывает на необходимость инициализации.

  • если несколько классов наследуют от базы, а инициализация более сложна (например, проверка диапазона), этот код - и политика - не распространяется на несколько производных классов

  • если m_a является неизменным, требуется инициализация конструктора

  • производные классы могут иметь более одного CTor, больше мест, чтобы забыть

Единственный недостаток: немного больше печатания - если вы не учитываете дополнительное «Сегодня я немного ленив, поэтому не забудьте инициализировать m_a во всех конструкторах производных классов»

«Подпись объявляет требования» является ИМО достаточной для того, чтобы сделать этот шаблон шаблоном по умолчанию, так же как «другой способ требует защиты m_a», как упомянуто в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...