Перегрузка унаследованных конструкторов - PullRequest
0 голосов
/ 08 октября 2018

Учитывая следующий базовый класс:

class Base {
    int a, b;
public:
    Base(int a, int b=42): a(a), b(b) { }
};

И класс, производный от базы:

class Derived: public Base {
    using Base::Base; // inherit Base constructors
    bool c;
public:
    Derived(int a): Base(a), c(true) { }
    Derived(int a, int b): Base(a, b), c(true) { }
};

Есть ли способ избежать создания двух отдельныхконструкторы для Derived и вместо этого перегружают унаследованные Base конструкторы для инициализации дополнительного члена Derived?

Я думал использовать что-то вроде этого:

template <typename... Args, 
    typename std::enable_if_t<std::is_constructible_v<Base, Args&&...>, int> = 0>
explicit Derived(Args&&... args):
    Base(std::forward<Args>(args)...), c(true) {}

Этоclose, но слишком многословно и не работает, если конструкторы базового класса наследуются.т. е. если в классе присутствует using Base::Base (то по умолчанию используются эти конструкторы и не инициализируется поле b).

Однако это работает, если унаследованные конструкторы базового класса отсутствуют, т.е. удаляются using Base::Base.


Это единственный способ получить эту работу?то есть путем удаления using Base::Base и использования конструктора шаблонов variadic в каждом производном классе?Есть ли менее подробный способ перегрузки унаследованных конструкторов?

Я использую C ++ 17.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Похоже, что вы ищете способ наследовать конструкторы Base, просто инициализируя члены Derived чем-то конкретным.Для этого мы можем по умолчанию инициализировать член:

class Derived: public Base {
public:
    using Base::Base;
private:
    bool c = true;
};

Создание Derived(42) вызовет конструктор Base(int), но также инициализирует c в true.

0 голосов
/ 08 октября 2018

В этом случае все, что вам нужно сделать, это предоставить c инициализатором класса in *

class Derived : public Base {
    using Base::Base;
    bool c = true;
};

позволяет использовать конструкторы Base и инициализировать c в trueво всех случаях.

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