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

Базовый класс в иерархии наследования. Вывод свойств объектов

24.10.2014, 18:45. Показов 2364. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасти. Помогите исправить функцию print_out именно таким образом:

C++
1
2
3
4
void print_out() {
                   void print_out_prop1(); // вывод какого-либо свойства объекта
                   void print_out_prop2();
}
Листинг моей программы:

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <iomanip> 
#include <conio.h>
#include <string.h>
 
#define M_PI 3.14159265358979323846
 
using namespace std;
 
/*================================================
Создать иерархию классов Точка-Круг-Конус. Конус должен
содержать метод определения объема. Последние два класса
должны иметь конструкторы.
===================================================*/
 
//Класс Point (Точка)
class Point { 
    public:
        int x;
        int y;
 
};
 
//Класс Cirlce (Круг)
class Circle : public Point {
    public:
        double r1; //радиус круга
 
        Circle(double r1) {
            r1 = r1;
        }
};
 
//Класс Cone (Конус)
class Cone : public Circle {
    public:
        double H; //высота конуса
        double volume; //объем конуса,,
        
        Cone(double r1, double h1):Circle(r1) {
            H = h1;
        }
 
        void calculate_volume() {
            volume = (1.0 / 3.0) * H * M_PI; //Формула для нахождения объема конуса
        }
 
 
        void print_out() {
            
            cout << "--------------------------------------------" << endl;
            cout << "Выводим все характеристики созданных объектов на экран: " << endl;
 
            cout << setw(25) << "Высота конуса: " << H << " единиц" << endl;
            cout << setw(25) << "Объем конуса: " << volume << endl;
                        cout << setw(25) << "Радиус конуса: " << r1 << " единиц" << endl;
            cout << "Выводим данные о сравнении двух конусов: " << endl;
        
        }
 
        void isLittle(Cone *obj) {
            cout << "1: Объем первого конуса: " << volume << " кубических единиц" << endl;
            cout << "2: Объем второго конуса: " << obj->volume << " кубических единиц" << endl;
 
            if (volume < obj->volume) {
                cout << "Объем первого конуса меньше, чем объем второго" << endl;
                print_out();
            }
            else
                obj->print_out();
            cout << "Объем первого конуса больше, чем объем первого" << endl;
        }
            
 
};
 
/*================================================
Создать метод MAIN, в котором создается два конуса,
определяется какой из конусов меньше, а также входит 
ли меньший конус в больший. Также показать все 
характеристики создаваемых объектов.
===================================================*/
 
void main() {
 
    setlocale(LC_ALL, "rus"); //настраиваем локаль
    setlocale(LC_NUMERIC, "C");
    
    /*================================================
    Такие параметры, чтобы меньший конус полностью
    входил в больший
    ===================================================*/
    Cone m(10, 10); 
    Cone n(6, 4); 
 
 
    m.calculate_volume(); //считаем объем первого конуса
    n.calculate_volume(); //считаем объем второго конуса
 
    m.isLittle(&n); //функция сравнения объемов двух конусов
    
    cout << "-------------------------------------------" << endl;
 
    system("pause");
}



Я не могу понять как вывести на экран данные радиуса и высоты второго конуса?
C++
1
 void print_out(Cone *obj)
не работает

Добавлено через 7 минут
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
void print_out_prop1() {
             
            cout << setw(25) << "Высота конуса: " << H << " единиц" << endl;
            cout << setw(25) << "Радиус конуса: " << r1 << " единиц" << endl;
            cout << setw(25) << "Объем конуса: " << volume << endl;
 
        }
 
        void print_out_prop2(Cone *obj) {
            cout << setw(25) << "Высота второго конуса: " << obj->H << " единиц" << endl;
            cout << setw(25) << "Радиус второго конуса: " << obj->r1 << " единиц" << endl;
            cout << setw(25) << "Объем второго конуса: " << obj->volume << endl;
        }
 
        void print_out() {
            
            cout << "--------------------------------------------" << endl;
            cout << "Выводим все характеристики созданных объектов на экран: " << endl;
 
            void print_out_prop1(); 
            void print_out_prop2();
            cout << "Выводим данные о сравнении двух конусов: " << endl;
        
        }

Вот еще такой вариант был, но блин, не работает что-то..
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2014, 18:45
Ответы с готовыми решениями:

Ошибка наследования error C2504: exception: не определен базовый класс
в .h файле пытаюсь унаследоваться class MyException : public exception { public: private: };

Добавление свойств в базовый класс
Товарищи, подскажите, как в приличном обществе принято решать такую задачу: Имеем, например, такую иерархию классов class A_Base {...

Базовый класс – СМИ. Производные – телеканал и газета. Создать класс Холдинг, который может содержать оба вида объектов
Базовый класс – СМИ. Производные – телеканал и газета. Создать класс Холдинг, который может содержать оба вида объектов. Предусмотреть...

13
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
24.10.2014, 18:52
Цитата Сообщение от MessageToBears Посмотреть сообщение
Circle : public Point
круг это точка?
Цитата Сообщение от MessageToBears Посмотреть сообщение
Cone : public Circle
конус это круг?
Ты бредишь, а не учишься наследованию! Твои представления о наследовании в корне неверные!

впрочем, если хочешь закрыть на этот бред глаза, то просто добавь виртуальную функцию в каждый класс
Цитата Сообщение от MessageToBears Посмотреть сообщение
C++
1
2
3
4
5
6
//Класс Point (Точка)
 class Point { 
public: 
int x; 
int y; 
};
C++
1
2
3
4
5
6
7
//Класс Point (Точка)
 class Point { 
public: 
int x; 
int y; 
virtual void print();
};
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
24.10.2014, 18:58
Цитата Сообщение от MessageToBears Посмотреть сообщение
Circle(double r1)
{ r1 = r1; }
C++
1
2
Circle(double r1)
 { this->r1 = r1; }
Остальное вроде выводится правильно.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2014, 19:05
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Твои представления о наследовании в корне неверные!
Kuzia domovenok, почитай тему: Перегруженный оператор вывода
Там есть ссылка на литературу, где приведён пример такого наследования.
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:09  [ТС]
На сколько я понимаю то при наследовании производный класс получает атрибуты других классов, в моем случае, класс конус получает атрибут радиуса класса Круг.

Иными словами, чтобы посчитать объем Конуса нужно знать радиус круга (основания конуса).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Класс Cirlce (Круг)
class Circle : public Point {
    public:
        double r1; //радиус круга
 
        Circle(double r1) {
            r1 = r1;
        }
};
 
//Класс Cone (Конус)
class Cone : public Circle {
    public:
        double H; //высота конуса
        double volume; //объем конуса,,
        
        Cone(double r1, double h1):Circle(r1) {
            H = h1;
        }
Если я в чем-то не прав, поправьте.

Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
Код C++
1
2
Circle(double r1)
{ this->r1 = r1; }
Остальное вроде выводится правильно.
Да, я это исправил, правда другим способом.

C++
1
2
3
4
Cone(double rad, double h1):Circle(r1) {
            H = h1;
            r1 = rad;
        }
Но опять же, как вывести на экран характеристики "противного" конуса.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void isLittle(Cone *obj) {
            cout << "1: Объем первого конуса: " << volume << " кубических единиц" << endl;
            cout << "2: Объем второго конуса: " << obj->volume << " кубических единиц" << endl;
 
            if (volume < obj->volume) {
                //cout << "Характеристики первого конуса: " << endl;
                cout << "Объем первого конуса меньше, чем объем второго" << endl;
            
                print_out();
            }
            else
                //cout << "Характеристики второго конуса: " << endl;
                obj->print_out();
            cout << "Объем первого конуса больше, чем объем первого" << endl;
            
        }
Вот тут он мне выводит только данные о конусе относительно этого сравнения
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2014, 19:16
Вот этот метод в классе зачем, вообще?
C++
1
void isLittle(Cone *obj)
1
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:20  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот этот метод в классе зачем, вообще?
Код C++
1
void isLittle(Cone *obj)

Препод сказал переделать так, чтобы в main вызывать

C++
1
m.isLittle(&n);
Если бы не это, этой темы на форуме не появилось бы.
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:26  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты бредишь, а не учишься наследованию! Твои представления о наследовании в корне неверные!
У Дейтела видимо представления тоже неверны
Миниатюры
Базовый класс в иерархии наследования. Вывод свойств объектов  
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
24.10.2014, 19:26
Лучший ответ Сообщение было отмечено MessageToBears как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void isLittle(Cone *obj) 
{
       cout << "1: Объем первого конуса: " << volume << " кубических единиц" << endl;
       cout << "2: Объем второго конуса: " << obj->volume << " кубических единиц" << endl;
 
       if (volume < obj->volume) 
       {
           cout << "Объем первого конуса меньше, чем объем второго" << endl;
       }else
       {
            cout << "Объем первого конуса больше, чем объем второго" << endl;
       }
       //cout << "Характеристики первого конуса: " << endl;
       print_out();
       //cout << "Характеристики второго конуса: " << endl;
       obj->print_out();
}
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.10.2014, 19:32
MessageToBears, Публичное наследование - это отношение is-a (является). Круг не является точкой. Следовательно наследование круга от точки - это бред, где бы это не было написано.
1
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:42  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
MessageToBears, Публичное наследование - это отношение is-a (является). Круг не является точкой. Следовательно наследование круга от точки - это бред, где бы это не было написано.
http://snilit.tspu.ru/uploads/files/default/c.pdf

812-813 страница.

Я не претендую на истину, но в учебнике Дейтела написано именно так. Но и спорить я с Вами не буду.

Не очень приятно читать такое:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты бредишь, а не учишься наследованию! Твои представления о наследовании в корне неверные!
Миниатюры
Базовый класс в иерархии наследования. Вывод свойств объектов  
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2014, 20:47
Хотите сравнивать конусы - перегрузите оператор сравнения.
Цитата Сообщение от MessageToBears Посмотреть сообщение
Препод сказал переделать так
Ну, раз препод... Тут оператор сравнения напрашивается.

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
MessageToBears, Публичное наследование - это отношение is-a (является). Круг не является точкой. Следовательно наследование круга от точки - это бред, где бы это не было написано.
ForEveR, интересно было бы послушать вашу дискусию с Дейтелами.
0
24.10.2014, 21:54

Не по теме:

alsav22, Хех, нет, спасибо, я глупее. Но is-a есть is-a.)

0
24.10.2014, 22:04

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Но is-a есть is-a.)
Вот, вот... Уже начало...:)
Из чего-то же и они исходили.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2014, 22:04
Помогаю со студенческими работами здесь

Абстрактный базовый класс, коллекция объектов, прогрессия
Описать абстрактный базовый класс и производные от него и создать параметризованную коллекцию объектов производных классов. Используя...

Создать иерархии наследования
a) Создать иерархии наследования: воздушный транспорт, пассажирский транспорт - лайнер Boing 747 b) Создать иерархии ...

Постоение иерархии наследования
нужно определить три класса: Expression — базовый класс иерархии, Number — для представления чисел и BinaryOperation — класс описывающий...

Дженерики в сложной иерархии наследования
Имеется набор классов: public class LocalClass extends ALocalClass&lt;TypeClass&gt; {} public abstract class ALocalClass&lt;T extends...

Создать абстрактный базовый класс объектов на декартовой плоскости CShape и разработать иерархию классов конкретных фигур
Создать абстрактный базовый класс объектов на декартовой плоскости CShape (фигура). Спроектировать и реализовать иерархию классов...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
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