Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 24.02.2020
Сообщений: 3

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

16.04.2020, 17:35. Показов 3510. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Если не затруднит, утолите мой интерес, пожалуйста!

Есть базовый и производный классы с атрибутами a, b - у базового и c, d - у производного.
Умею создавать объект производного класса с параметрами для производного (атрибуты базового = по умолчанию):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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" ещё два конструктора?:
C++
1
2
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() для создания всех вариаций экземпляров производного класса?
C++
1
2
3
4
5
6
7
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
}
Знаю, что можно переопределить эти переменные посредством такого конструктора:
C++
1
Derived(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) { }
и затем в main() передать аргументы:
C++
1
Derived d4(2, 2, 20, 20);
Но интересует именно вопрос о передаче аргументов конструктору базового. Как такое реализовать? Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2020, 17:35
Ответы с готовыми решениями:

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний треугольник.В конструкторе треугольника вводятся...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его затюнинговать, сделал ему производный класс с...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.04.2020, 20:35
Как вызвать конструктор базового, ты сам показал во втором фрагменте.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.04.2020, 20:41
Цитата Сообщение от bl1te Посмотреть сообщение
Но интересует именно вопрос о передаче аргументов конструктору базового. Как такое реализовать? Спасибо.
Цитата Сообщение от bl1te Посмотреть сообщение
Derived(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) { }
C++
1
Derived(int _a, int _b, int _c, int _d) : Base(_a, _b), c(_c), d(_d) { }
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
16.04.2020, 20:50
Цитата Сообщение от bl1te Посмотреть сообщение
Должен ли я для этого описать в классе "Derived" ещё два конструктора?:
C++
1
2
Derived() : Base(2, 2), c(10), d(10) { } // Base с параметрами, Derived по умолчанию
Derived(int _c, int _d) : Base(2, 2), c(_c), d(_d) { } // Base с параметрами, Derived с параметрами
Именно так. Но не "еще два", "именно такие два".

Цитата Сообщение от bl1te Посмотреть сообщение
Знаю, что можно переопределить эти переменные посредством такого конструктора:
C++
1
Derived(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d) { }
Откуда это вы взяли такое "знаю"? Нет, так нельзя. Конструктор Derived не может напрямую инициализировать поля Base в своем списке инициализации. Он может только передавать аргументы для конструктора Base, как вы сами показали в примере выше. Вот и передавайте

C++
1
Derived(int _a, int _b, int _c, int _d) : Base(_a, _b), c(_c), d(_d) { }
0
0 / 0 / 0
Регистрация: 24.02.2020
Сообщений: 3
16.04.2020, 23:14  [ТС]
Спасибо ответившим. Со вторым вопросом из стартового поста, благодаря вам, разобрался (вызов Derived и Base с параметрами):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Base class constructors
Base() : a(1), b(1) { }
Base(int _a, int _b) : a(_a), b(_b) { }
 
// Derived class constructors
Derived() : c(10), d(10) { } // d1
Derived(int _c, int _d) : c(_c), d(_d) { } // d2
// строка для d3
Derived(int _a, int _b, int _c, int _d) : Base(_a, _b), c(_c), d(_d) { } // d4
 
// main()
Derived d1; // a = 1; b = 1; c = 10; d = 10
Derived d2(20, 20); // a = 1; b = 1; c = 20; d = 20
// строка для d3
Derived d4(2, 2, 20, 20); // a = 2, b = 2, c = 20, d = 20
Неясным для меня остался вопрос: как создать экземпляр Derived, имеющий значения a и b = 2 (инициализированные в конструкторе Base с параметрами) и значения c и d = 10 (инициализированные в конструкторе Derived по умолчанию)?
Если я добавлю конструктор вида
C++
1
Derived(int _a, int _b) : Base(_a, _b) { }
и затем в main вызову
C++
1
Derived d3(20, 20);
то будет явно что-то неправильно. Во-первых, компилятор ругается на такой конструктор. Во-вторых, d3 вызовет тот же конструктор, который вызывает d2.

Не по теме: TheCalligrapher, скажи, пожалуйста, как выделить в посте определённое слово (как у тебя "Derived" и "Base") и, если знаешь, как выделить текст, который "не по теме"?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.04.2020, 23:54
Ты зациклился на этих конструкторах? А если бы там было 3 уровня наследования или 4? Ты бы все возможные комбинации явно заданного и по умолчанию перебирал и спрашивал как сделать такие конструкторы? Какое практическое значение это имеет?
0
0 / 0 / 0
Регистрация: 24.02.2020
Сообщений: 3
18.04.2020, 11:38  [ТС]
На другом ресурсе дали ответ!
Необходимо добавить конструктор вида:
C++
1
2
Derived(const Base& ab)
        : Base(ab), c(10), d(10) { }
и в main() вызвать его таким образом:
C++
1
Derived d3(Base(2, 2));
Тогда поля Base будут с параметрами, а поля Derived - по умолчанию.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
18.04.2020, 11:51
Цитата Сообщение от bl1te Посмотреть сообщение
Тогда поля Base будут с параметрами, а поля Derived - по умолчанию.
Если бы вы для задания умолчаний указали инициализаторы прямо на объявлениях полей класса (вместо явного выписывания инициализаций полей в конструкторах), то то же самое можно было бы достичь компактнее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Base
{
  int a = 1, b = 1;
  Base() = default;
  Base(int a, int b) : a(a), b(b) {}
};
 
struct Derived : Base
{
  int c = 10, d = 10;
  Derived() = default;
  Derived(int a, int b) : Base(a, b)
    {}
};
Теперь конструктор Derived d3(2, 2); делает именно то, что вы хотели.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.04.2020, 13:23
Цитата Сообщение от bl1te Посмотреть сообщение
На другом ресурсе дали ответ!
Необходимо добавить конструктор вида:
Создавать экземпляр базового класса, для того чтобы передавать параметры в конструктор наследника, да ещё через копирование - это идиотизм. Хотя бы уж посоветовали через rvalue - Derived(Base &&ab)

Ну и - попробуй сделать базовый класс абстрактным (что часто бывает) и схема сразу развалится
C++
1
2
3
4
5
6
7
8
9
10
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
 
    virtual void func() = 0;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2020, 13:23
Помогаю со студенческими работами здесь

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...

Наследование. Конструктор базового класса в теле производного
Здравствуйте! Помогите, пожалуйста, разобраться. Есть пример: class String { protected: static const short SIZE = 10; ...

Создать конструктор производного и базового класса с переменными
Помогите доделать задание, нужно создать конструктор производного и базового класса с переменными и из конструктора производного класса...

Ссылка базового класса на объект производного класса
Граждане, объясните почему такое происходит. До того как проверил, думал, что если для ссылки базового класса запустить конструктор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru