Создать объект производного класса с передачей параметров в конструктор базового класса
Если не затруднит, утолите мой интерес, пожалуйста!
Есть базовый и производный классы с атрибутами 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 шт):
1) Как создать объект производного класса по умолчанию, передав какие-нибудь аргументы в конструктор базового класса?
А где вы их планируете передать? Конструктор по умолчанию - он без параметров. Так что это только "через голову" конструктора, типа, через глобальную переменную - но это же ужасно некрасиво...
2) Как создать объект производного класса с параметрами, передав какие-нибудь аргументы в конструктор базового класса?
Непонятно, как это трактовать. Вы передаете параметры для конструктора базового в производном? Запросто:
Derived(int d1, int d2, int b1, int b2):Base(b1, b2),...... // прочая инициализация
Вы хотите передавать параметры в базовый конструктор, но создавать при этом объект производного? Надеюсь, это я просто неверно вас понял, потому что по-хорошему ну не должен знать базовый класс о производных. Такой вот гулящий это родитель... :)
Я посмотрел ваши комментарии к ответу. Наверное, можно решить так - передавать в 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). Можете добавлять дополнительный параметр какого-то специально разработанного типа, или сделать фаблики объектов.