Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/31: Рейтинг темы: голосов - 31, средняя оценка - 4.55
AndrK189100
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 10
1

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

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

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

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

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

Если неправ, укажите правильный путь))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2012, 18:12
Ответы с готовыми решениями:

Множественное наследование
В спортивных соревнованиях различных видов спорта приняли участие люди из...

Множественное наследование
Друзья прошу помочь разобраться, как получить доступ из массива J, к методу...

Множественное наследование
Листинг: #include <iostream> using namespace std; class Person{private:...

Множественное наследование
Есть два класса Human(fname, lname) и класс Employee c чисто виртуальными функц...

Множественное наследование
Возник вопрос по теме множественное наследование. Вот скажем у нас определены...

47
Kuzia domovenok
2438 / 2145 / 524
Регистрация: 25.03.2012
Сообщений: 7,725
Записей в блоге: 1
25.04.2012, 18:48 2
второй вариант верный
наследник должен быть частным случаем родителя.
всякий ромб и всякий прямоугольник есть параллелограм, но не каждый параллелограм - ромб или прямоугольник.
Всякий квадрат это ромб, также всякий квадрат это прямоугольник,
но не каждый ромб или прямоугольник есть квадрат
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.04.2012, 18:59 3
По хорошему тут наследование, тем более множественное, вообще не стоит использовать. Максимум агрегацию, но и она тут не нужна.
0
Kuzia domovenok
2438 / 2145 / 524
Регистрация: 25.03.2012
Сообщений: 7,725
Записей в блоге: 1
25.04.2012, 19:18 4
Цитата Сообщение от diagon Посмотреть сообщение
По хорошему тут наследование, тем более множественное, вообще не стоит использовать. Максимум агрегацию, но и она тут не нужна.
Пример множественного наследования не всегда легко придумать. В учебных целях часто дают примеры с фигурами.

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

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

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

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


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

В геометрии же параллелограмм так же реален, как и квадрат и ромб и прямоугольник.
Ну немного по другому действовать надо.
Мы не получаем каждую. слежующую фигуру естественным образом, как реальное воплощение предыдущей абстракции. Нет ну за уши можно притянуть ООП и сюда, но зачем?
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
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
Kuzia domovenok
2438 / 2145 / 524
Регистрация: 25.03.2012
Сообщений: 7,725
Записей в блоге: 1
25.04.2012, 21:05 15
Базовый класс не обязан быть абстрактным. Если ты используешь наследование исключительно от абстрактных классов, ты не полностью понимаешь, зачем оно нужно.

Добавлено через 36 секунд
Цитата Сообщение от gray_fox Посмотреть сообщение
Следуя такому подходу, легче вообще не пользоваться наследованием. Делать как-нибудь так:
Я об этом тоже писал ему
0
AndrK189100
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 10
25.04.2012, 21:15  [ТС] 16
Это, чисто, учебная задачка. Попросили помочь, а в результате, сам прошу помощи.(((
Как иерархию не строй, все равно, методы для каждого класса будут свои. Мне непонятно, в чем тогда смысл наследования... А сделать надо. Скоро сессия)
0
thick_int
Заблокирован
25.04.2012, 21:18 17
Цитата Сообщение от gray_fox Посмотреть сообщение
Следуя такому подходу, легче вообще не пользоваться наследованием.
Нет ну если с геометрией не лады, то тогда можно и так.
А вообще, если солидно подходить к подобной задаче, то разумеется (ну к примеру, выбрав за отправную точку понятие параллелограмм), следует предусмотреть ряд конструкторов, которые позволяют по задаваемым параметрам строить этот параллелограмм. А также предусмотреть ряд предикатных функций, позволяющих делать суждения о том, является ли данный параллелограмм ромбом, прямоугольником и квадратом.
0
Kuzia domovenok
2438 / 2145 / 524
Регистрация: 25.03.2012
Сообщений: 7,725
Записей в блоге: 1
25.04.2012, 21:21 18
Цитата Сообщение от thick_int Посмотреть сообщение
Нет ну если с геометрией не лады, то тогда можно и так.
А вообще, если солидно подходить к подобной задаче, то разумеется (ну к примеру, выбрав за отправную точку понятие параллелограмм), следует предусмотреть ряд конструкторов, которые позволяют по задаваемым параметрам строить этот параллелограмм. А также предусмотреть ряд предикатных функций, позволяющих делать суждения о том, является ли данный параллелограмм ромбом, прямоугольником и квадратом.
Чепуха. У ТСа задание: реализовать множественное наследование.
Ему нужен Класс Параллелограм м
Ромб - наследник от параллелограмма
Прямоугольник - наследник от параллелограмма
Квадрат- наследник от ромба и прямоугольника.
Например.
Параллелограмм строится по двум сторонам и углу между ними
Прямоугольник по двум сторонам
Ромб по стороне и двум углам,
Квадрат по стороне.
0
defer
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 800
25.04.2012, 21:22 19
Цитата Сообщение от AndrK189100 Посмотреть сообщение
Мне непонятно, в чем тогда смысл наследования
Цитата Сообщение от AndrK189100 Посмотреть сообщение
Это, чисто, учебная задачка
смысла тут нет, просто пиши код
0
thick_int
Заблокирован
25.04.2012, 21:24 20
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Чепуха. У ТСа задание: реализовать множественное наследование.
Не ну кто бы спорил с тем что иногда препы дают оченьглупые задания.
0
25.04.2012, 21:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 21:24

Множественное наследование
Имеется множественное наследование в виде треугольника. Если в обоих базовых...

Множественное наследование
По этой схеме нужно сделать множественное наследование. Вот код:#include...

Множественное наследование
Вычислите площадь и периметр прямоугольника, если известны его диагональ и одна...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru