Что такое наследование конструктора?
В C++11 что подразумевается под наследованием конструктора? Если это то, что я думаю (конструктор базового класса находится в области действия производного класса), как это повлияет на мой код? Каковы применения такой функции?
1 ответ
Наследование Конструкторов означает только это. Производный класс может неявно наследовать конструкторы от своего базового класса (классов).
Синтаксис выглядит следующим образом:
struct B
{
B(int); // normal constructor 1
B(string); // normal constructor 2
};
struct D : B
{
using B::B; // inherit constructors from B
};
Итак, теперь у D есть следующие конструкторы, неявно определенные:
D::D(int); // inherited
D::D(string); // inherited
Члены Ds по умолчанию создаются этими унаследованными конструкторами.
Как будто конструкторы были определены следующим образом:
D::D(int x) : B(x) {}
D::D(string s) : B(s) {}
Эта особенность не является чем-то особенным. Это просто сокращение, чтобы сохранить набираемый шаблонный код.
Вот кровавые детали:
12.9 Наследование конструкторов
1) Объявление использования, которое именует конструктор, неявно объявляет набор наследующих конструкторов. Набор кандидатов унаследованных конструкторов из класса X, названного в объявлении using, состоит из фактических конструкторов и условных конструкторов, которые получаются в результате преобразования параметров по умолчанию следующим образом:
- все не шаблонные конструкторы X, и
- для каждого нешаблонного конструктора X, который имеет по меньшей мере один параметр с аргументом по умолчанию, набор конструкторов, который получается в результате пропуска любой спецификации параметра с многоточием и последовательного пропуска параметров с аргументом по умолчанию в конце списка параметров-типов, а также
- все шаблоны конструктора X, и
- для каждого шаблона конструктора X, который имеет хотя бы один параметр с аргументом по умолчанию, набор шаблонов конструктора, который получается в результате пропуска любой спецификации параметра с многоточием и последовательного пропуска параметров с аргументом по умолчанию в конце списка параметров-типов