C++ параметры по-умолчанию для конструктора базового класса

Рейтинг: -1Ответов: 2Опубликовано: 11.06.2023

Есть есть класс А, от него наследуется В и я хочу поставить для консруктора А параметры по-умолчанию, то придется пробрасывать их через коснруктор В(или же продублировать установки по-умолчанию в конструкторе В)? Т.е. как-то так:

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)
{
...
}

По-другому никак не избежать пробрасывания?

Ответы

▲ 1
class  B : public A
{
public:
    using A::A; // наследуем все констркторы, каке есть в A
private:
    int x=42; // Если в B есть члены, которые требуется инициализировать 
              // специальным знечением, можно использовать указание значения 
              // по умолканию, в точке декларации члена.
};
▲ 0

Моя попытка решить через пробрасывание (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

Полезные ссылки: