Создать объект производного класса с передачей параметров в конструктор базового класса

Если не затруднит, утолите мой интерес, пожалуйста!

Есть базовый и производный классы с атрибутами a, b - у базового и c, d - у производного. Умею создавать объект производного класса с параметрами для производного (атрибуты базового = по умолчанию):

class Base
{
public:
    int a, b;

    Base() : a(1), b(1) { } // Base по умолчанию: a = 1, b = 1
    Base(int _a, int _b) : a(_a), b(_b) { } // Base с параметрами: a = 2, b = 2
};

class Derived : public Base
{
public:
    int c, d;

    Derived() : c(10), d(10) { } // Derived по умолчанию: a = 1, b = 1, c = 10, d = 10
    Derived(int _c, int _d) : c(_c), d(_d) { } // Derived с параметрами: a = 1, b = 1, c = 20, d = 20
};

int main()
{
    Derived d1; // a = 1; b = 1; c = 10; d = 10
    Derived d2(20, 20); // a = 1; b = 1; c = 20; d = 20
}

1) Как создать объект производного класса по умолчанию, передав какие-нибудь аргументы в конструктор базового класса?

2) Как создать объект производного класса с параметрами, передав какие-нибудь аргументы в конструктор базового класса?

Должен ли я для этого описать в классе "Derived" ещё два конструктора?:

Derived() : Base(2, 2), c(10), d(10) { } // Base с параметрами, Derived по умолчанию
Derived(int _c, int _d) : Base(2, 2), c(_c), d(_d) { } // Base с параметрами, Derived с параметрами

В таком случае, что надо написать в main() для создания всех вариаций экземпляров производного класса?

int main()
{
    Derived d1; // a = 1; b = 1; c = 10; d = 10
    Derived d2(20, 20); // a = 1; b = 1; c = 20; d = 20
    // объект d3, у которого: a = 2, b = 2, c = 10, d = 10
    // объект d4, у которого: a = 2, b = 2, c = 20, d = 20
}

Знаю, что можно переприсвоить значения этим переменным посредством такого конструктора:

Derived(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) { }

и затем в main() передать аргументы:

Derived d4(2, 2, 20, 20);

Но интересует именно вопрос о передаче аргументов конструктору базового во время создания объекта производного. Как такое реализовать? Спасибо.


Ответы (2 шт):

Автор решения: Harry

1) Как создать объект производного класса по умолчанию, передав какие-нибудь аргументы в конструктор базового класса?

А где вы их планируете передать? Конструктор по умолчанию - он без параметров. Так что это только "через голову" конструктора, типа, через глобальную переменную - но это же ужасно некрасиво...

2) Как создать объект производного класса с параметрами, передав какие-нибудь аргументы в конструктор базового класса?

Непонятно, как это трактовать. Вы передаете параметры для конструктора базового в производном? Запросто:

Derived(int d1, int d2, int b1, int b2):Base(b1, b2),...... // прочая инициализация

Вы хотите передавать параметры в базовый конструктор, но создавать при этом объект производного? Надеюсь, это я просто неверно вас понял, потому что по-хорошему ну не должен знать базовый класс о производных. Такой вот гулящий это родитель... :)

→ Ссылка
Автор решения: Mikhailo

Я посмотрел ваши комментарии к ответу. Наверное, можно решить так - передавать в Derived параметры для Base

Derived(int a, int b, int с = 10, int d = 10)
:Base(a,b),c(c),d(d) { ... }

Вызов Derived d(a,b) вызовет конструктор Base(a,b) и выполнит действия со значениями по умолчанию c и d.

Беда только, что у вас будет коллизия с простым конструктором Derived(c,d). Можете добавлять дополнительный параметр какого-то специально разработанного типа, или сделать фаблики объектов.

→ Ссылка