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

Простое наследование в с++. Базовый класс (AEROFLOT) и дочерний (REIS)

17.05.2015, 16:09. Показов 2261. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два класса: базовый (AEROFLOT) и дочерний (REIS). При компиляции у меня конструктор по умолчанию базового класса вызывается два раза. Почему так и как исправить? Заранее огромное спасибо.
AEROFLOT.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <string>
#include <stdlib.h>
#include <clocale>
 
using namespace std;
 
class AEROFLOT
{
private:
 
    string punkt_naz;
    int num;
    string type_plane;
 
public:
 
    //конструктор по умолчанию
    AEROFLOT()
    {
        punkt_naz = " ";
        num = 0;
        type_plane = " ";
        cout << "Вызван конструктор по умолчанию базового класса AEROFLOT." << endl;
        cout << "Пункт назначения - " << punkt_naz << endl;
        cout << "Номер рейса - " << num << endl;
        cout << "Тип самолета - " << type_plane << endl;
    }
 
    //конструктор с парметрами
    AEROFLOT(std::string m_punkt_naz, int m_num, std::string m_type_plane)
    {
        punkt_naz = m_punkt_naz;
        num = m_num;
        type_plane = m_type_plane;
    }
 
    //Конструктор копирования
    AEROFLOT(const AEROFLOT &obj1)
    {
        punkt_naz = obj1.punkt_naz;
        num = obj1.num;
        type_plane = obj1.type_plane;
    }
 
    //метод для вывода значений
    void write_parameters() const
    {
        cout << "Место прибытия - " << punkt_naz << endl;
        cout << "Номер рейса - " << num << endl;
        cout << "Тип самолета - " << type_plane << endl;
    }
    
    //метод для ввода параметров с клавиатуры
    void set_parameters() 
    {
        cout << "Введите место прибытия - " << endl;
        cin >> punkt_naz;
        cout << "Введите номер рейса - " << endl;
        cin >> num;
        cout << "Введите тип самолета - " << endl;
        cin >> type_plane;
        cout << endl;
    }
 
    //Деструктор
    ~AEROFLOT(){};
};
 
//дочерний класс REIS
class REIS :public AEROFLOT
{
    private:
        
        string rast;
        int cost;
 
    public:
 
        //вызов производным классом конструктора по умолчанию базового класса
        REIS() : AEROFLOT()
        {
            rast = " ";
            cost = 0;
            cout << "Вызван конструктор по умолчанию дочернего класса REIS." << endl;
            cout <<"Расстояние до пункта назначения - "<<rast<<endl;
            cout << "Стоимость билета - " << cost << endl << endl;
 
        };
        
        //вызов производным классом конструктора с параметрами базового класса (не сделал)
        REIS(std::string rast1, int cost1)
        {
            rast1 = rast;
            cost1 = cost;
        }
 
        //метод, осуществляющий ввод значений полей класса с клавиатуры
        void set_parameters()
        {
            AEROFLOT::set_parameters();
            cout << "Введите расстояние до пункта назначения - " << endl;
            cin >> rast;
            cout << "Введите стоимотсь билета - " << endl;
            cin >> cost;
            cout << endl;
        }
 
        //метод, осуществляющий вывод значений полей класса с клавиатуры
        void write_parameters() const
        {
            AEROFLOT::write_parameters();
            cout << "Расстояние до пункта назначения - " << rast << endl;
            cout << "Стоимость билета - " << cost << endl;
        }
};
Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "AEROFLOT.h"
#include <clocale>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(0, "rus");
 
    AEROFLOT aero1;
    REIS r1;
 
    aero1.set_parameters();
    r1.set_parameters();
    cout << "Вывод информации:" << endl;
    aero1.write_parameters();
    r1.write_parameters();
 
    system("PAUSE");
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.05.2015, 16:09
Ответы с готовыми решениями:

Создать иерархию классов, представляющих простое наследование. Базовый класс – строка символов (char *)
. Создать иерархию классов представляющих простое наследование. Базовый класс – строка символов (char *). Производный класс – методы,...

Наследование - дочерний класс
Помогите разобраться: Выношу в дочерний класс часть расчета пользуюсь только: public class abc extends cba{ Все переменные у меня...

Наследование: базовый класс Квадрат, производный класс Пирамида
Помогите, пожалуйста!:cry: Добавлено через 6 минут Создать класс КВАДРАТ, член класса- длинна стороны. Предусмотреть в классе методы...

8
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.05.2015, 16:14
Цитата Сообщение от Antisfen Посмотреть сообщение
При компиляции у меня конструктор по умолчанию базового класса вызывается два раза.
это не возможно.
времени компиляции компилятор генерирует код.
самой программы ещё не существует.
никакие конструкты на этом этапе не вызываются.

Цитата Сообщение от Antisfen Посмотреть сообщение
Почему так и как исправить?
времени выполнения:

Цитата Сообщение от Antisfen Посмотреть сообщение
//вызов производным классом конструктора с параметрами базового класса (не сделал)
* * * * REIS(std::string rast1, int cost1)
если не указать явно какой конструктор базового класса нужно позвать,
то по дефолту будет вызван дефолтный.
0
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 77
17.05.2015, 17:19  [ТС]
Как исправить? Только начал с наследованием знакомиться. Я не могу понять, почему конструктор по умолчанию базового класса появляется два раза. И ввод элементов базового класса тоже два раза происходит! Что не так с кодом?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.05.2015, 17:22
Цитата Сообщение от Antisfen Посмотреть сообщение
При компиляции у меня конструктор по умолчанию базового класса вызывается два раза.
Один раз для aero1, один раз для r1. Конструктор потомка, в обязательном порядке вызывает конструктор предка и только потом начинает работать сам. Так и задумано.
0
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 77
17.05.2015, 17:29  [ТС]
Т.е. конструктор потомка вызовет свой конструктор+конструктор базового класса, а потом еще и базовый класс выведет свой конструктор? Тогда почему ввод элементов базового класса два раза происходит?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.05.2015, 17:47
Цитата Сообщение от Antisfen Посмотреть сообщение
Т.е. конструктор потомка вызовет свой конструктор+конструктор базового класса, а потом еще и базовый класс выведет свой конструктор?
Т.е. aero1 вызывает конструктор базового класса, а потом r1 вызовет конструкторы базового класса и его наследника. Итого, конструктор базового класса вызывается дважды, но для разных объектов.
Цитата Сообщение от Antisfen Посмотреть сообщение
Тогда почему ввод элементов базового класса два раза происходит?
Сколько раз set_parameters написали, столько раз он ввод элементов и попросил.
0
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 77
17.05.2015, 17:54  [ТС]
Один раз я set_parameters написал для базового класса, один раз вызываю: aero1.set_parameters(); Затем я написал set_parameters для дочернего класса (для объекта дочернего класса): r1.set_parameters(); В данном случае я должен был один раз ввести пункт назначения, номер рейса, тип самолета (элементы базового класса). Затем должен быть ввод элементов дочернего класса: расстояние и стоимость билета. НО! При запуске я , мало того, что вижу конструктор базового класса по умолчанию два раза, так я еще и ввожу элементы этого класса два раза. Я ведь set_parameters для разных объектов вызывал один раз. Что я делаю не так?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.05.2015, 18:21
Цитата Сообщение от Antisfen Посмотреть сообщение
Что я делаю не так?
Копируете чужой код даже не читая.
C++
1
2
3
void set_parameters()//метод REIS
{
    AEROFLOT::set_parameters();//отфутболивает на метод AEROFLOT
Разумеется, set_parameters от AEROFLOT в итоге вызывается повторно.
0
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 77
17.05.2015, 18:47  [ТС]
Весь код, что я кидал, написан мной лично, а вот эта штука AEROFLOT::set_parameters() была в примере к лабораторной работе. Исправил все: в main() убрал создание объекта для базового класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2015, 18:47
Помогаю со студенческими работами здесь

Виртуальное наследование (указатель на базовый класс)
У меня ромбическая иерархия классов, при попытке вызвать метод производного класса ошибка, что я не так делаю? Вот исходный код ...

Абстрактный базовый класс и множественное наследование
Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: • конструктор, ...

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

Множественное наследование (Разработайте базовый класс CLIENT)
Задание: Множественное наследование. Разработайте базовый класс CLIENT. Элемент класса: ФИО; количество поездок. ...

Наследование: базовый класс - массив, наследник - матрица
Помогите пожалуйста с наследованием. базовый класс - массив, наследник - матрица. Использовать именно наследование.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru