С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,615

Полиморфизм. Иерархия наследования

11.05.2017, 23:40. Показов 1724. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! У меня вопрос по полиморфизму. Допустим, есть класс Shape он может быть абстрактным, но точно он базовый, так же есть ещё два класса от него зависящие TwoDimensionalShape и ThreeDimensionalShape они так же базовые для конкретных классов фигур, но так как ни класс TwoDimensionalShape ни класс ThreeDimensionalShape не совершают никаких действий над функциями, которые должны каким-то образом манипулировать фигурами, в данном случае, вычислять площадь и объём фигуры, то я пришёл к выводу, что они тоже абстрактные(В классе Shape функции getArea() и getVolume() определены как чисто виртуальные) , допустимо такое и насколько целесообразно?

Для начала вот код, не весь, но часть присутствует:



Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SHAPE_H
#define SHAPE_H 
 
#include <string>
using std::string;
 
class Shape 
{
    public:
        Shape(const string&);
        void setShapeName(const string&);
        string getShapeName() const;
        
        virtual double getArea() const = 0;
        virtual double getVolume() const = 0;
        
        virtual void print() const;
    private:
        string shapeName;
};
#endif

Кликните здесь для просмотра всего текста
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
#include <iostream>
using std::cout;
 
#include "Shape.h"
 
Shape::Shape(const string& shape):shapeName(shape)
{
    setShapeName(shape);
}
 
void Shape::setShapeName(const string& shape)
{
    shapeName = shape;
}
 
string Shape::getShapeName() const 
{
    return shapeName;
}
 
void Shape::print() const
{
    cout << "shape name: " << getShapeName();
}


Кликните здесь для просмотра всего текста
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
#ifndef TWO_H
#define TWO_H 
 
#include <string>
using std::string;
 
 
#include "Shape.h"
 
class TwoDimensionalShape : public Shape 
{
    public:
        TwoDimensionalShape(const string&, double = 0.0);
        
        void setWigth(double);
        double getWigth() const;
        
        virtual double getArea() const = 0;
 
    private:
        double wigth;
};
 
#endif


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "TwoDimensionalShape.h"
 
TwoDimensionalShape::TwoDimensionalShape(const string& shape, double _wigth):Shape(shape)
{
    setWigth(_wigth);
}
 
void TwoDimensionalShape::setWigth(double _wigth)
{
    wigth = (_wigth < 0) ? 0.0 : _wigth;
}
 
double TwoDimensionalShape::getWigth() const 
{
    return wigth;
}


Кликните здесь для просмотра всего текста
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
#ifndef THREE_H
#define THREE_H 
 
#include <string>
using std::string;
 
#include "Shape.h"
 
class ThreeDimensionalShape : public Shape 
{
    public:
        ThreeDimensionalShape(const string&, double = 0.0);
        void setWigth(double);
        double getWigth() const;
        
        void setShapeName(const string&);
        string getShapeName() const;
        
        virtual double getArea() const = 0;
        virtual double getVolume() const = 0;
    private:
        string shapeName;
        double wigth;
};
#endif


Кликните здесь для просмотра всего текста
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
#include "ThreeDimensionalShape.h"
 
ThreeDimensionalShape::ThreeDimensionalShape(const string& shape, double _wigth):Shape(shape)
{
    setWigth(_wigth);
}
 
void ThreeDimensionalShape::setWigth(double _wigth)
{
    wigth = (_wigth < 0.0) ? 0.0 : _wigth;
}
 
double ThreeDimensionalShape::getWigth() const 
{
    return wigth;
}
 
void ThreeDimensionalShape::setShapeName(const string& shape)
{
    shapeName = shape;
}
 
string ThreeDimensionalShape::getShapeName() const 
{
    return shapeName;
}
Миниатюры
Полиморфизм. Иерархия наследования  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2017, 23:40
Ответы с готовыми решениями:

Иерархия наследования Student / Aspirant
Создайте класс Student, который будет содержать информацию о студенте. С помощью механизма наследования, реализуйте класс Aspirant...

Отношения наследования и включения. Полиморфизм
Задание: Пусть компьютер характеризуется установленным процессором, устройством хранения данных и размером оперативной памяти. Процессор...

Задача на принцип наследования и полиморфизм
Используя стандартную библиотеку шаблонов STL и класс list по работе с двунаправленным списком, выполнить следующие задачи: 1) Даны...

7
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.05.2017, 00:36
Зачем вы в классах TwoDimensionalShape и ThreeDimensionalShape заново объявляете чисто виртуальные функции с той же сигнатурой? Вы можете опустить это объявление, объекты этих классов всё равно будут абстрактными.

Добавлено через 56 секунд
Цитата Сообщение от Liss29 Посмотреть сообщение
C++
1
using std::string;
В хедерах лучше избегать. При его подключении все имена string неявно сыпяться в std, что может привести к конфликтам.

Добавлено через 1 минуту
И не за чем вам везде заново определять и реализовывать методы setShapeName и getShapeName. Производные классы итак унаследуют их.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,615
12.05.2017, 06:27  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Зачем вы в классах TwoDimensionalShape и ThreeDimensionalShape заново объявляете чисто виртуальные функции с той же сигнатурой?
Их вообще можно не определять в TwoDimensionalShape и ThreeDimensionalShape даже как виртуальные?


Добавлено через 5 минут
C++
1
using std::string;
Если убираю, то сыпятся ошибки, но буду иметь ввиду.

Добавлено через 2 часа 45 минут
Сделал небольшие изменения, в Shape оставил только одну чисто виртуальную функцию т.к. getArea() пользуются функций как из TwoDimensionalShape так и ThreeDimensionalShape, а вторую getVolume() объявил чисто виртуальной в классе ThreeDimensionalShape т.к. она используется для подсчёта объёма, только, у трёхмерных функций, по условию задачи.

На данный момент выглядит так:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SHAPE_H
#define SHAPE_H 
 
#include <string>
using std::string;
 
class Shape 
{
    public:
        Shape(const string&);
        void setShapeName(const string&);
        string getShapeName() const;
        
        virtual double getArea() const = 0;
        //virtual double getVolume() const = 0;
        
        virtual void print() const;
    private:
        string shapeName;
};
#endif


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef THREE_H
#define THREE_H 
 
 
#include "Shape.h"
 
class ThreeDimensionalShape : public Shape 
{
    public:
        ThreeDimensionalShape(const string&, double = 0.0);
        void setWigth(double);
        double getWigth() const;
        
        virtual double getVolume() const = 0;
    private:
        //string shapeName;
        double wigth;
};
#endif


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef TWO_H
#define TWO_H 
 
#include "Shape.h"
 
class TwoDimensionalShape : public Shape 
{
    public:
        TwoDimensionalShape(const string&, double = 0.0);
        
        void setWigth(double);
        double getWigth() const;
 
    private:
        double wigth;
};
 
#endif


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CUBE_H
#define CUBE_H 
 
#include "ThreeDimensionalShape.h"
 
class Cube : public ThreeDimensionalShape 
{
    public:
        Cube(const string& shape, double);
        
        virtual double getArea() const;
        virtual double getVolume() const;
        
    private:
        const int six;
};
#endif


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef TRIANGLE_H
#define TRIANGLE_H 
 
#include "TwoDimensionalShape.h"
 
class Triangle : public TwoDimensionalShape 
{
    public:
        Triangle(const string&, double, double);
        void setHight(double);
        
        virtual double getArea() const;
 
    private:
        double hight;
    
};
#endif


Такое решение имеет право на жизнь или есть какие-то тонкие моменты на которые мне стоит обратить внимание, чтобы не повторять в будущем?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.05.2017, 11:54
Лучший ответ Сообщение было отмечено Liss29 как решение

Решение

Цитата Сообщение от Liss29 Посмотреть сообщение
Если убираю, то сыпятся ошибки, но буду иметь ввиду.
Надо явно указывать пространство имён в заголовочных файлах. А в файлах реализации (.cpp), если уж очень хочется - можете добавлять эти строчки.

Добавлено через 3 минуты
У вас всё равно остаётся дублирование свойства width + методов getWindth / setWidth в классах **DimentionalShape.
Мб, раз уж всё равно имя присваиваете в Shape, тогда и ширину добавить?
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,615
12.05.2017, 21:28  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Мб, раз уж всё равно имя присваиваете в Shape, тогда и ширину добавить?
да, можно и так, ведь эти данные и в Two и в ThreeDimensionalShape присутствуют, но пока сделал так, всё работает, но что-то мне покоя не даёт всё равно)

Добавлено через 57 минут
(Полиморфный экранный менеджер, использующий иерархию Shape ) Разрабо*тайте элементарный графический пакет. Воспользуйтесь иерархией класса Shape, реализованной в упражнении 13.13. Ограничьтесь двумерными геомет*рическими фигурами, такими, как квадраты, прямоугольники, треугольники и круги. Предусмотрите интерактивное взаимодействие с пользователем. Он мо*жет указывать положение, размер, форму и заполняющие символы, которые будут использоваться при рисовании каждой фигуры. Он может нарисовать много объектов одной формы. При создании каждой фигуры помещайте указатель Shape на вновь созданный объект в массив. Каждый класс имеет собственную функцию draw. Напишите полиморфный экранный менеджер, который форми*рует изображение, проходя по массиву и посылая сообщение draw каждому его объекту. Выполняйте перерисовку изображения всякий раз, когда пользователь специфицирует новую фигуру.
Интересное задание, но не пойму, ладно координаты, размер фигуры, но как можно форму задать, например, круга или квадрата никак не пойму.
Интерактивное взаимодействие с пользователем - это что значит, что нужно перед прорисовкой фигуры спросить координаты, размер, символ ... так что ли?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,615
14.05.2017, 05:27  [ТС]
Интересно, а как круг в консоли нарисовать? Я, как только не пробовал, получается ромб, но никак не круг. Без API-функций тут никак не обойтись?
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
14.05.2017, 06:43
Цитата Сообщение от Liss29 Посмотреть сообщение
Интересно, а как круг в консоли нарисовать?
Ellipse function?
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,615
14.05.2017, 20:40  [ТС]
Цитата Сообщение от dailydose Посмотреть сообщение
Ellipse function?
Я про то, как написать самому функцию, а эта ссылка не в тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2017, 20:40
Помогаю со студенческими работами здесь

Иерархия множественного наследования и шаблон
Имеется абстрактный класс Playerpublic abstract class Player {...}от него наследую 2 класса: User и Computerpublic class User : Player...

Задачки: Классы, наследования и полиморфизм!!!
Помогите решить три задачки... 1. Определить класс &quot;Стадион&quot;, предусмотрев в нем компонентные данные: название, виды спорта, год...

Иерархия наследования или виртуальные методы
Есть блок кода (1), где в методе paintComponent() происходит вот такая бяка: у объекта типа Graphics2D вызывается метод fill(), НО в самом...

Для чего вообще нужен полиморфизм. Какая польза от наследования
Здравствуйте всем. Кто зашел в эту ветку форума. Вопрос такой. Есть ООП и один из трех столпов - полиморфизм. Суть полиморфизма ясна и для...

Чем отличаются структуры для наследования интерфейса от структур для наследования реализаций?
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с маленькой просьбой. Я никак не могу...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru