C++ параметры по-умолчанию для конструктора базового класса
Есть есть класс А, от него наследуется В и я хочу поставить для консруктора А параметры по-умолчанию, то придется пробрасывать их через коснруктор В(или же продублировать установки по-умолчанию в конструкторе В)? Т.е. как-то так:
A::A(T1 a=10, T2 b=10, T3 c=11)
{
...
}
B::B(T1 a, T2 b=10, T3 c=11):A(a,b,c)
{
...
}
По-другому никак не избежать пробрасывания?
Ответы (2 шт):
Автор решения: Be3y4uu_K0T
→ Ссылка
Моя попытка решить через пробрасывание (perfect forwarding).
#include <iostream>
template<typename T1, typename T2, typename T3>
class A {
public:
T1 a;
T2 b;
T3 c;
A(T1 a = 10, T2 b = 10, T3 c = 11): a{a}, b{b}, c{c} {}
};
template<typename T1, typename T2, typename T3>
class B: public A<T1, T2, T3> {
public:
template<typename... Args>
B(T1 a, Args&&... args): A<T1, T2, T3>(a, std::forward<Args>(args)...) {}
};
int main() {
B<int, int, int> b(1, 2);
std::cout << b.a << " " << b.b << " " << b.c << std::endl;
return 0;
}
Результат:
1 2 11
Полезные ссылки:
Автор решения: Chorkov
→ Ссылка
class B : public A
{
public:
using A::A; // наследуем все констркторы, каке есть в A
private:
int x=42; // Если в B есть члены, которые требуется инициализировать
// специальным знечением, можно использовать указание значения
// по умолканию, в точке декларации члена.
};