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

Наследование классов

09.04.2025, 18:38. Показов 5996. Ответов 39

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Изучаю наследование классов, но никак не могу понять, в чём ошибка в следующем коде:
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
#include <iostream>
#include <list>
 
class Vehicle // основной класс
{
private:
  std::string nameVehicle;
  std::list<std::string> colorsVehicle;
  int MaxSpeedVehicle;
  float priceVehicle;
  std::string typeVehicle;
public:
  void printVehicleInfo () {
    std::cout << "Название транспортного средства: " << nameVehicle << std::endl;
    for (std::string colorsVh: colorsVehicle)
    {
      std::cout << "Цвет транспортного средства: " << colorsVh << std::endl;
    }
    std::cout << "Максимальная скорость " << MaxSpeedVehicle << std::endl;
    std::cout << "Цена транспортного средства: " << priceVehicle << std::endl;
    std::cout << "Тип транспортного средства: " << typeVehicle << std::endl;
  }
 
  Vehicle(std::string name, std::list<std::string> colors, int MaxSpeed, float price, std::string type)
  {
    name = nameVehicle;
    colors = colorsVehicle;
    MaxSpeed = MaxSpeedVehicle;
    price = priceVehicle;
    type = typeVehicle;
  }
};
 
class Car: public Vehicle // наследующий класс
{
  public:
  Car(std::string nameCar, std::list<std::string> colorsCar,  int MaxSpeedCar, float priceCar, std::string typeCar): Vehicle (nameCar, colorsCar, MaxSpeedCar, priceCar, typeCar)
  {
 
  }
};
 
class Motorcycle: public Vehicle // наследующий класс
{
  public:
  Motorcycle(std::string nameMotorcycle, std::list<std::string> colorsMotorcycle,  int MaxSpeedMotorcycle, float priceMotorcycle, std::string typeMotorcycle): Vehicle (nameMotorcycle, colorsMotorcycle, MaxSpeedMotorcycle, priceMotorcycle, typeMotorcycle)
  {
 
  }
};
 
class Boat: public Vehicle // наследующий класс
{
  public:
  Boat(std::string nameBoat, std::list<std::string> colorsBoat,  int MaxSpeedBoat, float priceBoat, std::string typeBoat): Vehicle (nameBoat, colorsBoat, MaxSpeedBoat, priceBoat, typeBoat)
  {
 
  }
};
 
int main ()
{
  setlocale (LC_ALL, "Russian");
 
  Car Lada2106("LADA", {"белый", "чёрный", "серый"}, 180, 1200900.90, "Автомобиль");
  Motorcycle Upiter("Юпитер", {"оранжевый", "красный", "синий"}, 100, 500900.99, "Мотоцикл");
  Boat Speeder3000 ("Speeder 3000", {"чёрный", "коричневый", "серый"}, 250, 500800.90, "Лодка");
 
  Lada2106.printVehicleInfo();
  std::cout << std::endl;
  Upiter.printVehicleInfo();
  std::cout << std::endl;
  Speeder3000.printVehicleInfo();
 
  system ("pause>0");
}
У меня тут основной класс Vehicle, а также 3 наследуемых класса Car, Motorcycle и Boat. У основного и 3 наследуемых классов реализовал конструктор. Вроде, правильно всё сделал. Программа компилируется, не выводит никаких ошибок, но результат вывода совсем неправильный. Выводит какую-то ерунду, а цвета, которые я реализовал через list
C++
1
std::list<std::string> colorsVehicle
даже не пытается вывести вообще, хотя вывожу, вроде, тоже правильно:
C++
1
2
3
4
    for (std::string colorsVh: colorsVehicle)
    {
      std::cout << "Цвет транспортного средства: " << colorsVh << std::endl;
    }
Подскажите, пожалуйста, в чём дело? Что конкретно не так и почему. Желательно, с объяснениями, потому что изучаю эту тему для себя и искренне желаю разобраться.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2025, 18:38
Ответы с готовыми решениями:

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int...

Наследование классов. Копирование производных классов
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; class A //Создаем...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг...

39
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
09.04.2025, 19:11
Лучший ответ Сообщение было отмечено aleksevgeny как решение

Решение

Цитата Сообщение от aleksevgeny Посмотреть сообщение
C++
1
2
3
4
5
 name = nameVehicle;
 colors = colorsVehicle;
 MaxSpeed = MaxSpeedVehicle;
 price = priceVehicle;
 type = typeVehicle;
Вы параметрам конструктора присваиваете значения членов класса, а нужно наоборот. Местами поменяйте.
1
1 / 1 / 0
Регистрация: 17.11.2021
Сообщений: 45
09.04.2025, 19:41  [ТС]
DrOffset, ужас, я даже и не заметил ведь. Только непонятно, почему компилятор ничего не сказал и позволил это дело скомпилировать.

Добавлено через 1 минуту
Ещё такой вопрос, с Вашего позволения, вот у меня цена (price) типа float и я точно указал цену, например, 500900.99, но мне выводит округлённое значение, то есть 500901. Почему так и что с этим делать?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
09.04.2025, 20:15
Цитата Сообщение от aleksevgeny Посмотреть сообщение
Только непонятно, почему компилятор ничего не сказал и позволил это дело скомпилировать.
А компилятору пофигу. Параметр не константный, значение присваивать можно. Возможно даже оптимизатор этот код совсем уберёт, ибо на результат это никак не влияет.

Цитата Сообщение от aleksevgeny Посмотреть сообщение
вот у меня цена (price) типа float и я точно указал цену, например, 500900.99, но мне выводит округлённое значение, то есть 500901.
Да. Так это и работает.
Не буду в стотысячный раз расписывать почему числа с плавающей точкой неточные.
Обратитесь к буквально любой документации.

Цитата Сообщение от aleksevgeny Посмотреть сообщение
и что с этим делать?
Серьезные ребята хранят деньги в виде количества единиц минимального достоинства.
Для рубля это в копейках.
И только при выводе можно вывести число копеек, делённое на сто в виде рублей и остаток от деления числа копеек на сто в виде копеек.
2
1 / 1 / 0
Регистрация: 17.11.2021
Сообщений: 45
09.04.2025, 20:26  [ТС]
Всем большое спасибо за ответы! Тему можно закрывать
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
10.04.2025, 06:48
aleksevgeny, В таком виде Ваша иерархия классов бесполезна.
Всегда можно создавать экземпляры класса Vehicle и указывать в последнем параметре тип.
Наследование должно подразумевать что-то новое.
Поскольку Вы подразумеваете тип, то он не должен присутствовать в базовом классе,
а наследники как раз и будут определять тип АВТОМАТИЧЕСКИ!
И тут как раз напрашивается задействовать полиморфизм объявив метод printVehicleInfo () виртуальным
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
#include <iostream>
#include <iomanip>
#include <string>
#include <list>
 
class Vehicle // основной класс
{
private:
    std::string nameVehicle;
    std::list<std::string> colorsVehicle;
    int MaxSpeedVehicle;
    double priceVehicle;
    //std::string typeVehicle;
public:
    virtual void printVehicleInfo () {
        std::cout << "Название транспортного средства: " << nameVehicle << std::endl;
        std::list<std::string>::iterator p;
        std::cout << "Цвета транспортного средства: ";
        for (p=colorsVehicle.begin();p!=colorsVehicle.end();++p)
        {
             std::cout << *p<< ' ';
        }
        std::cout << '\n' << "Максимальная скорость " << MaxSpeedVehicle << std::endl;
        std::cout << "Цена транспортного средства: " << std::fixed<<std::setprecision(2)<<priceVehicle << std::endl;
    }
 
    Vehicle(std::string name, std::list<std::string> colors, int MaxSpeed, double price)
    {
        nameVehicle=name;
        colorsVehicle=colors;
        MaxSpeedVehicle=MaxSpeed;
        priceVehicle=price;
    }
};
 
class Car: public Vehicle // наследующий класс
{
public:
    Car(std::string name, std::list<std::string> colors,  int MaxSpeed, double price)
        : Vehicle (name, colors, MaxSpeed, price){}
    void printVehicleInfo () {
        std::cout << "Легковой Автомобиль\n";
        Vehicle::printVehicleInfo();
    }
};
 
class Motorcycle: public Vehicle // наследующий класс
{
public:
    Motorcycle(std::string name, std::list<std::string> colors,  int MaxSpeed, double price)
        : Vehicle (name, colors, MaxSpeed, price){}
    void printVehicleInfo () {
        std::cout << "Мотоцикл\n";
        Vehicle::printVehicleInfo();
    }
};
 
class Boat: public Vehicle // наследующий класс
{
public:
    Boat(std::string name, std::list<std::string> colors,  int MaxSpeed, double price)
        : Vehicle (name, colors, MaxSpeed, price){}
    void printVehicleInfo () {
        std::cout << "Лодка\n";
        Vehicle::printVehicleInfo();
    }
};
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    std::list<std::string> colors;
    const int N=3;
    Vehicle* vv[N];
 
    colors.push_back("белый");
    colors.push_back("чёрный");
    colors.push_back("серый");
    vv[0]= new Car("LADA", colors, 180, 1200900.90);
    colors.clear();
    colors.push_front("оранжевый");
    colors.push_front("красный");
    colors.push_front("синий");
    vv[1]=new Motorcycle("Юпитер", colors, 100, 500900.99);
    colors.clear();
    colors.push_front("чёрный");
    colors.push_front("коричневый");
    colors.push_front("серый");
    vv[2]=new Boat("Speeder 3000", colors, 250, 500800.90);
 
    for(int i=0;i<N;i++)
    {
        vv[i]->printVehicleInfo();
        std::cout << std::endl;
    }
    for(int i=0;i<N;i++)
        delete vv[i];
 
    system ("pause > NUL");
}

p.s. извиняюсь за такое заполнение списков colors (у меня VS 2008 не поддерживает инициализацию контейнеров).
1
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
10.04.2025, 07:00
zss, я сначала подумал, что кто-то бсод словил
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
10.04.2025, 11:37
Можно пойти дальше и сделать класс Vehicle абстрактным
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
#include <iostream>
#include <iomanip>
#include <string>
#include <list>
 
class Vehicle // основной класс
{
private:
    std::string nameVehicle;
    std::list<std::string> colorsVehicle;
    int MaxSpeedVehicle;
    double priceVehicle;
    //std::string typeVehicle;
public:
    Vehicle(std::string name, std::list<std::string> colors, int MaxSpeed, double price)
        :nameVehicle(name),colorsVehicle(colors),MaxSpeedVehicle(MaxSpeed),priceVehicle(price){}
    virtual void printVehicleInfo()=0;   //   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
};
void Vehicle::printVehicleInfo () {
        std::cout << "Название транспортного средства: " << nameVehicle << std::endl;
        std::list<std::string>::iterator p;
        std::cout << "Цвета транспортного средства: ";
        for (p=colorsVehicle.begin();p!=colorsVehicle.end();++p)
        {
             std::cout << *p<< ' ';
        }
        std::cout << '\n' << "Максимальная скорость " << MaxSpeedVehicle << std::endl;
        std::cout << "Цена транспортного средства: " << std::fixed<<std::setprecision(2)<<priceVehicle << std::endl;
    }
 
 
class Car: public Vehicle // наследующий класс
{
public:
    Car(std::string name, std::list<std::string> colors,  int MaxSpeed, double price)
        : Vehicle (name, colors, MaxSpeed, price){}
    void printVehicleInfo () {
        std::cout << "Легковой Автомобиль\n";
        Vehicle::printVehicleInfo();
    }
};
 
class Motorcycle: public Vehicle // наследующий класс
{
public:
    Motorcycle(std::string name, std::list<std::string> colors,  int MaxSpeed, double price)
        : Vehicle (name, colors, MaxSpeed, price){}
    void printVehicleInfo () {
        std::cout << "Мотоцикл\n";
        Vehicle::printVehicleInfo();
    }
};
 
class Boat: public Vehicle // наследующий класс
{
public:
    Boat(std::string name, std::list<std::string> colors,  int MaxSpeed, double price)
        : Vehicle (name, colors, MaxSpeed, price){}
    void printVehicleInfo () {
        std::cout << "Лодка\n";
        Vehicle::printVehicleInfo();
    }
};
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    std::list<std::string> colors;
    const int N=3;
    Vehicle* vv[N];
 
    colors.push_back("белый");
    colors.push_back("чёрный");
    colors.push_back("серый");
    //vv[0]= new Vehicle("LADA", colors, 180, 1200900.90); // !!!!!   такое теперь не прокатит
    vv[0]= new Car("LADA", colors, 180, 1200900.90);
    colors.clear();
    colors.push_back("оранжевый");
    colors.push_back("красный");
    colors.push_back("синий");
    vv[1]=new Motorcycle("Юпитер", colors, 100, 500900.99);
    colors.clear();
    colors.push_back("чёрный");
    colors.push_back("коричневый");
    colors.push_back("серый");
    vv[2]=new Boat("Speeder 3000", colors, 250, 500800.90);
 
    for(int i=0;i<N;i++)
    {
        vv[i]->printVehicleInfo();
        std::cout << std::endl;
    }
    for(int i=0;i<N;i++)
        delete vv[i];
 
    system ("pause > NUL");
}
1
1 / 1 / 0
Регистрация: 17.11.2021
Сообщений: 45
10.04.2025, 12:17  [ТС]
zss, о, вот это очень интересно. Спасибо большое, что потратили время и расписали. Я про полиморфизм и абстрактные классы пока ещё не особо шарю, но как раз изучаю это, поэтому будет интересно разобраться в Вашем коде
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
10.04.2025, 13:36
Цитата Сообщение от zss Посмотреть сообщение
и сделать класс Vehicle абстрактным
нужно только ещё виртуальный деструктор и override в потомках (2008 студия их умеет )
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.04.2025, 13:42
Цитата Сообщение от zss Посмотреть сообщение
у меня VS 2008 не поддерживает инициализацию контейнеров
Да уж, с++03(msvc 2008) это вам не кандибобер на с++20.
0
1 / 1 / 0
Регистрация: 17.11.2021
Сообщений: 45
10.04.2025, 14:19  [ТС]
Интересно, чем вызвана необходимость использовать Visual Studio 2008? Связано ли это со слабым железом, где нельзя ничего поновее поставить? Ну тогда можно тот же Visual Studio Code накатить, всех возможностей полноценной IDE, конечно же, не будет, но писать код и скомпилировать его вполне можно, но надо ставить отдельно компилятор. Я эту программу как раз в VS Code писал, VS Code + msys2. А ещё можно компилятор от Microsoft использовать из Visual Studio (CL), но там неудобно немного, потому что через консоль надо компилировать. Кстати, если кто-то знает, есть ли возможность его прикрутить к VS Code без необходимости использовать консоль, то расскажите, пожалуйста.
P/S Я помню, что когда-то у Microsoft была замечательная программа для студентов DreamSpark, вот там можно было бесплатно получить лицензионный Microsoft Visual Studio 2008, а ещё Windows 8.1 Embedded, и ряд других программ. Потом прикрыли эту программу, к сожалению...
UPD: А ещё если cl.exe использовать для компиляции в VS Code, то кириллицу не поддерживает вообще почему-то, даже если setlocale прописываешь. Интересно, почему так
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
10.04.2025, 15:31
Просто я к VS 2008 привык. У меня ещё есть VS 2017, но пользуюсь ей когда уж совсем никак.
Кстати, от Windows 7 тоже не хочу отказываться!
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.04.2025, 15:41
Цитата Сообщение от aleksevgeny Посмотреть сообщение
UPD: А ещё если cl.exe использовать для компиляции в VS Code, то кириллицу не поддерживает вообще почему-то, даже если setlocale прописываешь. Интересно, почему так
Лучше не начинайте.
Просто учитесь работать с Юникодом.

Добавлено через 5 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
Интересно, почему так
Разные компиляторы. У них различные дефолтные настройки и различные библиотеки.

Добавлено через 3 минуты
То есть, какой бы компилятор ни был, важны след. аспекты:
1. Кодировка исходников.
2. Кодировка консоли, в какой кодировке она осуществляет ввод/вывод.
3. Компилятор так же должен знать в какой кодировке принимает ваши исходники.
setlocale(), как можно понять, напрямую к этим трем пунктам отношения не имеет.
2
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
10.04.2025, 18:04
Цитата Сообщение от zss Посмотреть сообщение
Просто я к VS 2008 привык. У меня ещё есть VS 2017, но пользуюсь ей когда уж совсем никак.
Кстати, от Windows 7 тоже не хочу отказываться!
я был такой. Прекрасно всё это понимаю.
Но я перешёл на VS2019, а винда сменилась на 10 при покупке ноута.

И я не жалею ни разу Десятка просто удобнее семёрки. А студия - ещё и официально бесплатная (community редакция)

Так что, очень советую.
0
1 / 1 / 0
Регистрация: 17.11.2021
Сообщений: 45
10.04.2025, 19:06  [ТС]
Алексей1153, вообще даже Community редакция, на сколько я знаю, имеет определённые ограничения в плане лицензирования. На официальном сайте сказано примерно следующее:
1. Неограниченное количество пользователей может использовать Community-edition для проведения обучения, open-source разработки или научных исследований (и только для этого, "доля научных исследований" сюда не попадает, если она не равна 100%).
2. Если у вас не больше 250 компьютеров и меньше миллиона долларов оборота в год, вы можете использовать Community-edition для любых целей для 5 пользователей.

Для остальных сценариев надо покупать лицензию. Понимаю, что это не особо важно для среднестатистического человека, просто захотелось добавить эту информацию, так как когда-то активно изучал эту тему и искал соответствующую информацию.

Ну и можно с 10 винды на 11 перейти, например, ибо это тоже самое, просто немного красивее. Да и поддержка 10ки заканчивается в этом году (кроме, LTSC версии, ибо она будет до 2038 года поддерживаться), так что это ещё и актуально

Ну и добавлю, что иногда требуется использовать именно определённую версию студии. Например, Unreal Engine 5 требует именно Visual Studio 2022, 2019 не подойдёт, её можно только с Unreal Engine 4 использовать. А ещё 2022 является 64-битной, что несомненный плюс для нынешних систем.
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
10.04.2025, 19:33
Цитата Сообщение от aleksevgeny Посмотреть сообщение
На официальном сайте сказано примерно следующее:
но кому интересно, что там сказано?
Кроме того, меня вполне эти два пункта устраивают.

Цитата Сообщение от aleksevgeny Посмотреть сообщение
Да и поддержка 10ки заканчивается в этом году
так у семёрки она когда уж закончилась, а та всё ещё обновляется
0
1 / 1 / 0
Регистрация: 17.11.2021
Сообщений: 45
10.04.2025, 19:43  [ТС]
В общем, я переписал код чутка, согласно вашим замечаниям, господа:

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
#include <iostream>
#include <iomanip>
#include <list>
 
class Vehicle // Основной класс
{
private: // делаем члены класса приватными
  std::string nameVehicle; // название транспорта
  std::list <std::string> colorsVehicle; // доступные цвета транспорта
  int maxSpeedVehicle; // максимальная скорость транспорта
  double priceVehicle; // цена транспорта
public:
  void printVehicleInfo () // функция вывода информации о транспортном средстве
  {
    std::cout << "Название: " << nameVehicle << std::endl; // выводим название транспорта
    // выводим доступные цвета транспорта
    std::cout << "Доступные цвета: \n";
    for (std::string colors: colorsVehicle)
    {
      std::cout << colors << std::endl;
    }
    std::cout << "Максимальная скорость: " << maxSpeedVehicle << std::endl; // выводим максимальную скорость транспорта
    std::cout << "Цена: " << std::fixed << std::setprecision(2) << priceVehicle << std::endl; // выводим цену транспорта
  }
  Vehicle (std::string name, std::list <std::string> colors, int maxSpeed, double price) // создаём конструктор основного класса Vehicle с соответствующими параметрами
  {
    // присваиваем значения членов класса к параметрам конструктора
    nameVehicle = name;
    colorsVehicle = colors;
    maxSpeedVehicle = maxSpeed;
    priceVehicle = price;
  }
};
 
class Car: public Vehicle // создаём наследующий класс Car
{
  public:
  // создаём конструктор наследующего класса Car с соответствующими параметрами
  Car (std::string nameCar, std::list <std::string> colorsCar, int maxSpeedCar, double priceCar): Vehicle (nameCar, colorsCar, maxSpeedCar, priceCar)
  {
 
  }
  void printCarInfo()
  {
    std::cout << "Автомобиль: \n";
    Vehicle::printVehicleInfo();
  }
};
 
class Motorcycle: public Vehicle // создаём наследующий класс Motorcycle
{
 public:
   // создаём конструктор наследующего класса Motorcycle с соответствующими параметрами
 Motorcycle (std::string nameMotorcycle, std::list <std::string> colorsMotorcycle, int maxSpeedMotorcycle, double priceMotorcycle): Vehicle (nameMotorcycle, colorsMotorcycle, maxSpeedMotorcycle, priceMotorcycle)
 {
 
 }
 void printMotorcycleInfo()
 {
  std::cout << "Мотоцикл: \n";
  Vehicle::printVehicleInfo();
 }
};
 
class Boat: public Vehicle // создаём наследующий класс Boat
{
  public:
     // создаём конструктор наследующего класса Boat с соответствующими параметрами
     Boat (std::string nameBoat, std::list<std::string> colorsBoat, int maxSpeedBoat, double priceBoat): Vehicle (nameBoat, colorsBoat, maxSpeedBoat, priceBoat)
     {
 
     }
     void printBoatInfo()
     {
      std::cout << "Лодка: \n";
      Vehicle::printVehicleInfo();
     }
};
 
int main ()
{
  setlocale (LC_ALL, "Russian"); // добавляем поддержку русского языка в консоль
 
  Car Lada2106 ("Lada 2106", {"чёрный", "белый", "синий"}, 200, 380990.90); // создаём объект наследующего класса Car
  Motorcycle Upiter ("Юпитер", {"оранжевый", "красный", "синий"}, 180, 150899.99); // создаём объект наследующего класса Motorcycle
  Boat Speeder3000 ("Speeder 3000", {"синий", "чёрный", "коричневый"}, 150, 90990.90); // создаём объект наследующего класса Boat
 
  Lada2106.printCarInfo(); // вызываем функцию вывода информации о транспорте для объекта
  std::cout << std::endl; // перенос на следующую строку
  Upiter.printMotorcycleInfo(); // вызываем функцию вывода информации о транспорте для объекта
  std::cout << std::endl; // перенос на следующую строку
  Speeder3000.printBoatInfo(); // вызываем функцию вывода информации о транспорте для объекта
 
  system ("pause>0");
}
Правда, я не стал в основном классе делать virtual void, а оставил просто void, но всё работает, как и должно.
Стало реально лучше и понятнее, так что ещё раз всем большое спасибо.

У меня появился вопрос Можно ли создать наследующий класс у наследующего класса? Например, вот у меня есть основной класс Vehicle, у него есть наследующий класс Car. Можно ли пойти дальше и у этого наследующего класса Car создать свои наследующие классы? Например, Truck (грузовик), Sedan (седан) и т.д?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.04.2025, 20:11
Цитата Сообщение от aleksevgeny Посмотреть сообщение
Можно ли создать наследующий класс у наследующего класса? Например, вот у меня есть основной класс Vehicle, у него есть наследующий класс Car. Можно ли пойти дальше и у этого наследующего класса Car создать свои наследующие классы? Например, Truck (грузовик), Sedan (седан) и т.д?
Можно, крутите как хотите, только "ромбы" берегите)
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.04.2025, 20:14
Реальный пример иерархии классов:
Миниатюры
Наследование классов  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2025, 20:14
Помогаю со студенческими работами здесь

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс...

Определение классов, описание экземпляров классов (объектов). Уровни доступа к членам классов
Определить класс с именем Dyscyplina, что абстрагирует понятие &quot;Учебная дисциплина&quot; и содержит...

Наследование наследование )
Доброе время суток всем! Делаю одно задание и столкнулся с вопросом У меня есть клас Person и...

Наследование шаблоном шаблона (наследование конструктора)
Всем привет! Думаю, что эта тема хоть и касается общих вопросов программирования, но будет уместна...

решение задачи Конструкторы и деструкторы, Наследование, Множественное наследование. Полиморфизм
Задания такие Что зачеркнуто вроде сделано правильно) Если есть люди добрые не могли бы вы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru