Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.95
AndrK189100
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 10
#1

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

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

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

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

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

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

Множественное наследование - C++
Так как у меня эта тема заняла долгое время для изучения ,выкладываю простой пример для освоения #include<iostream> using namespace...

Множественное наследование - C++
Есть два класса Human(fname, lname) и класс Employee c чисто виртуальными функц (зарплата и печать). На базе этих классов нужно создать...

множественное наследование - C++
Почему не компилируется код? #include <iostream> #include <conio.h> #include <string.h> using namespace std; class...

Множественное наследование - C++
7 задание Сделайте пожалуйста, большое спасибо! :good:

Множественное наследование в С++ - C++
Столкнулся с такой проблемой: class D{ ... public: ... void setD(); ... }; class Dd : public D{ ...

множественное наследование - C++
разработайте алгоритм и создайте программы с применением множественного наследования. При выполнении данного задания необходимо создать не...

47
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,835
Записей в блоге: 1
25.04.2012, 18:48 #2
второй вариант верный
наследник должен быть частным случаем родителя.
всякий ромб и всякий прямоугольник есть параллелограм, но не каждый параллелограм - ромб или прямоугольник.
Всякий квадрат это ромб, также всякий квадрат это прямоугольник,
но не каждый ромб или прямоугольник есть квадрат
0
diagon
Higher
1936 / 1202 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.04.2012, 18:59 #3
По хорошему тут наследование, тем более множественное, вообще не стоит использовать. Максимум агрегацию, но и она тут не нужна.
0
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,835
Записей в блоге: 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
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,835
Записей в блоге: 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
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,835
Записей в блоге: 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!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,835
Записей в блоге: 1
25.04.2012, 20:55 #12
так давайте вообще наследование отменим и ООП и всё. Я не против. можно.
Ты этого хочешь, я понять не могу?
По-моему, ты слегка не понимаешь суть наследования.
0
thick_int
Заблокирован
25.04.2012, 21:02 #13
Дело не в наследовании, а в том, что применять его нужно по делу.
Вообще наследование хорошо, когда можно инкапсуулировать некоторые свойства в абстрактных сущностях (например, абстрактный класс ЧЕЛОВЕК).

В геометрии же параллелограмм так же реален, как и квадрат и ромб и прямоугольник.
Ну немного по другому действовать надо.
Мы не получаем каждую. слежующую фигуру естественным образом, как реальное воплощение предыдущей абстракции. Нет ну за уши можно притянуть ООП и сюда, но зачем?
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,835
Записей в блоге: 1
25.04.2012, 21:05 #15
Базовый класс не обязан быть абстрактным. Если ты используешь наследование исключительно от абстрактных классов, ты не полностью понимаешь, зачем оно нужно.

Добавлено через 36 секунд
Цитата Сообщение от gray_fox Посмотреть сообщение
Следуя такому подходу, легче вообще не пользоваться наследованием. Делать как-нибудь так:
Я об этом тоже писал ему
0
25.04.2012, 21:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 21:05
Привет! Вот еще темы с ответами:

Множественное наследование - C++
Листинг: #include <iostream> using namespace std; class Person{private: string Fname,Sname,years;}; class Student{private:...

Множественное наследование - C++
Здравствуйте! Делаю следующее задание по подготовке к экзамену по С++. Пока только начал. Вкратце - есть абстрактный класс. Его...

Множественное наследование - C++
Добрый день. У меня имеется базовый класс A. У этого класса есть несколько наследников. Есть еще один класс B, который является...

Множественное наследование - C++
Возник вопрос по теме множественное наследование. Вот скажем у нас определены классы: class Animal{ public: int...


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

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

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