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

Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм

25.04.2012, 18:12. Показов 11351. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, разработать иерархию.
В дальнейшем надо реализовать несколько методов, среди которых изменение размера и вычисление площади.
Пока остановился на двух вариантах.
1)
Квадрату достаточно одного свойства, длинна стороны. От него наследуется прямоугольник(добавляется свойство ширина) и ромб(добавляется свойство высота к одной из диагоналей).
От ромба и прямоугольника наследуется параллелограмм( получаем все необходимые свойства).

2)
В обратном порядке от параллелограмма ромб и прямоугольник, от них уже квадрат.

Смущает то, что методы увеличения размера и вычисления площади у каждого класса будут свои. Зачем тогда наследование?

Если неправ, укажите правильный путь))))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2012, 18:12
Ответы с готовыми решениями:

Множественное наследование: определить класс Окружность, вписанная в ромб
С помощью множественного наследования определить класс Окружность, вписанная в ромб. Классы Круг и...

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

Определить тип параллелограмма (ромб, прямоугольник или квадрат)
Задача 1. Задан параллелограмм со сторонами a, b и углом α между ними. Определить тип...

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

47
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 18:48 2
второй вариант верный
наследник должен быть частным случаем родителя.
всякий ромб и всякий прямоугольник есть параллелограм, но не каждый параллелограм - ромб или прямоугольник.
Всякий квадрат это ромб, также всякий квадрат это прямоугольник,
но не каждый ромб или прямоугольник есть квадрат
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.04.2012, 18:59 3
По хорошему тут наследование, тем более множественное, вообще не стоит использовать. Максимум агрегацию, но и она тут не нужна.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 19:18 4
Цитата Сообщение от diagon Посмотреть сообщение
По хорошему тут наследование, тем более множественное, вообще не стоит использовать. Максимум агрегацию, но и она тут не нужна.
Пример множественного наследования не всегда легко придумать. В учебных целях часто дают примеры с фигурами.

Добавлено через 2 минуты
А если у нас есть функция, находящая, скажем вписанную в ромб окружность. И функция находящая описанную вокруг прямоугольника окружность.
Что их, обе дублировать для квадрата?
0
Заблокирован
25.04.2012, 20:05 5
Квадрату, как это ни удивительно, вообще нет места в этой иерархии, ибо
1) Прямоугольник - ЭТО ПАРАЛЛЕЛОГРАММ, все углы которого равны.
2) Ромб - ЭТО ПАРАЛЛЕЛОГРАММ, все стороны которого равны.

Поэтому к квадрату мы можем прийти и от ромба и от прямоугольника. Достаточно, поэтому, снабдить каждый из классов прямоугольника и ромба функцией bool IsSquare (может быть и чистой виртуальной в базовом классе параллелограмм).
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 20:23 6
Цитата Сообщение от thick_int Посмотреть сообщение
Поэтому к квадрату мы можем прийти и от ромба и от прямоугольника. Достаточно, поэтому, снабдить каждый из классов прямоугольника и ромба функцией bool IsSquare (может быть и чистой виртуальной в базовом классе параллелограмм).
Ты о множественном наследовании слышал?
0
Заблокирован
25.04.2012, 20:26 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты о множественном наследовании слышал?
Нуу слышать то слышал, но к зачем оно тут?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 20:27 8
Цитата Сообщение от thick_int Посмотреть сообщение
Квадрату, как это ни удивительно, вообще нет места в этой иерархии, ибо
1) Прямоугольник - ЭТО ПАРАЛЛЕЛОГРАММ, все углы которого равны.
2) Ромб - ЭТО ПАРАЛЛЕЛОГРАММ, все стороны которого равны.
Ты о множественном наследовании слышал? Это как раз тот самый случай. Квадрат это И ромб И прямоугольник. Он обладает свойствами и того и другого.
В квадрат может быть вписана окружность, как в ромб
И Квадрат может быть вписан в окружность, как прямоугольник,

У квадрата равные стороны как у ромба
И У квадрата прямые углы как у прямоугольника.

Квадрат можно использовать там где нужен прямоугольник
и там где нужен ромб


Цитата Сообщение от thick_int Посмотреть сообщение
Достаточно, поэтому, снабдить каждый из классов прямоугольника и ромба функцией bool IsSquare (может быть и чистой виртуальной в базовом классе параллелограмм).
Давайте вообще наследование отменим.
Создадим базовый класс параллелограм и Сделаем в нём четыре "ЧистоРеальных" функции isSquare isRomb isRectangle,
Можно ещё добавить функций IsTriangle isCircle isPolygon Тогда даже от параллелограма наследовать не надо: все фигуры под рукой :dance3:
0
Заблокирован
25.04.2012, 20:31 9
Ну тут немножко не так. Если Вы беретесь производить один класс от другого, то это прежде всего предполагает наделение его некими свойствами, которых нет в базовом. Тут же этого напрочь нет.
Ну чертили Вы ромб и неожиданно оказалось, что диагонали этого ромба равны между собой.
Это далеко не повод выделять такой объект в отдельный класс.
Тут не в программировании дело, а в здравом смысле.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
25.04.2012, 20:53 10
Единственное, что приходит в голову - объединить их каким-нибудь интерфейсом с методом вычисления площади.
Цитата Сообщение от thick_int Посмотреть сообщение
снабдить каждый из классов прямоугольника и ромба функцией bool IsSquare
Никогда так не делайте.
0
Заблокирован
25.04.2012, 20:55 11
Цитата Сообщение от gray_fox Посмотреть сообщение
Никогда так не делайте.
Обоснуйте.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 20:55 12
так давайте вообще наследование отменим и ООП и всё. Я не против. можно.
Ты этого хочешь, я понять не могу?
По-моему, ты слегка не понимаешь суть наследования.
0
Заблокирован
25.04.2012, 21:02 13
Дело не в наследовании, а в том, что применять его нужно по делу.
Вообще наследование хорошо, когда можно инкапсуулировать некоторые свойства в абстрактных сущностях (например, абстрактный класс ЧЕЛОВЕК).

В геометрии же параллелограмм так же реален, как и квадрат и ромб и прямоугольник.
Ну немного по другому действовать надо.
Мы не получаем каждую. слежующую фигуру естественным образом, как реальное воплощение предыдущей абстракции. Нет ну за уши можно притянуть ООП и сюда, но зачем?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
25.04.2012, 21:05 14
Цитата Сообщение от thick_int Посмотреть сообщение
Обоснуйте.
Следуя такому подходу, легче вообще не пользоваться наследованием. Делать как-нибудь так:
C++
1
2
3
4
5
6
7
8
9
10
11
class Figure {
public:
    enum type {SQUARE, TRIANGLE etc. };
 
    type get_type() const {
        return figType;
    }
 
private:
    type figType;
};
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 21:05 15
Базовый класс не обязан быть абстрактным. Если ты используешь наследование исключительно от абстрактных классов, ты не полностью понимаешь, зачем оно нужно.

Добавлено через 36 секунд
Цитата Сообщение от gray_fox Посмотреть сообщение
Следуя такому подходу, легче вообще не пользоваться наследованием. Делать как-нибудь так:
Я об этом тоже писал ему
0
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 10
25.04.2012, 21:15  [ТС] 16
Это, чисто, учебная задачка. Попросили помочь, а в результате, сам прошу помощи.(((
Как иерархию не строй, все равно, методы для каждого класса будут свои. Мне непонятно, в чем тогда смысл наследования... А сделать надо. Скоро сессия)
0
Заблокирован
25.04.2012, 21:18 17
Цитата Сообщение от gray_fox Посмотреть сообщение
Следуя такому подходу, легче вообще не пользоваться наследованием.
Нет ну если с геометрией не лады, то тогда можно и так.
А вообще, если солидно подходить к подобной задаче, то разумеется (ну к примеру, выбрав за отправную точку понятие параллелограмм), следует предусмотреть ряд конструкторов, которые позволяют по задаваемым параметрам строить этот параллелограмм. А также предусмотреть ряд предикатных функций, позволяющих делать суждения о том, является ли данный параллелограмм ромбом, прямоугольником и квадратом.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.04.2012, 21:21 18
Цитата Сообщение от thick_int Посмотреть сообщение
Нет ну если с геометрией не лады, то тогда можно и так.
А вообще, если солидно подходить к подобной задаче, то разумеется (ну к примеру, выбрав за отправную точку понятие параллелограмм), следует предусмотреть ряд конструкторов, которые позволяют по задаваемым параметрам строить этот параллелограмм. А также предусмотреть ряд предикатных функций, позволяющих делать суждения о том, является ли данный параллелограмм ромбом, прямоугольником и квадратом.
Чепуха. У ТСа задание: реализовать множественное наследование.
Ему нужен Класс Параллелограм м
Ромб - наследник от параллелограмма
Прямоугольник - наследник от параллелограмма
Квадрат- наследник от ромба и прямоугольника.
Например.
Параллелограмм строится по двум сторонам и углу между ними
Прямоугольник по двум сторонам
Ромб по стороне и двум углам,
Квадрат по стороне.
0
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
25.04.2012, 21:22 19
Цитата Сообщение от AndrK189100 Посмотреть сообщение
Мне непонятно, в чем тогда смысл наследования
Цитата Сообщение от AndrK189100 Посмотреть сообщение
Это, чисто, учебная задачка
смысла тут нет, просто пиши код
0
Заблокирован
25.04.2012, 21:24 20
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Чепуха. У ТСа задание: реализовать множественное наследование.
Не ну кто бы спорил с тем что иногда препы дают оченьглупые задания.
0
25.04.2012, 21:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2012, 21:24
Помогаю со студенческими работами здесь

Объявить систему классов: Точка, Прямоугольник, Квадрат, Ромб, Трапеция, Треугольник, Четырехугольник
Необходимо создать систему классов: Точка, Прямоугольник, Квадрат, Ромб, Трапеция, Треугольник,...

Записать программу, которая по выбранному названию фигуры (тре- угольник, квадрат, ромб, прямоугольник и т
Записать программу, которая по выбранному названию фигуры (тре- угольник, квадрат, ромб,...

Описать базовый класс: линия, параллелограмм, ромб
Условие: Определить иерархию классов, определить в этих классах методы, которые перемещает...

Уместиться ли целиком прямоугольник в параллелограмм
Выяснить, сможет ли прямоугольник со сторонами k и l целиком уместиться в параллелограмме ABCD, ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru