Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

Если неправ, укажите правильный путь))))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2012, 18:12     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм
Посмотрите здесь:

C++ Множественное наследование
C++ Множественное наследование
Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
25.04.2012, 21:28     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #21
Цитата Сообщение от thick_int Посмотреть сообщение
Не ну кто бы спорил с тем что иногда препы дают оченьглупые задания.
А иногда студенты не желают слушать преподов
AndrK189100
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 10
25.04.2012, 21:33  [ТС]     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #22
Цитата Сообщение от defer Посмотреть сообщение
смысла тут нет, просто пиши код
Код-то написал, по второму варианту(от параллелограмма) было бы чего писать....
Просто, непонятно, зачем тут наследование. Пойду думать...

Добавлено через 35 секунд
Спасибо всем)
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.04.2012, 21:34     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #23
Цитата Сообщение от thick_int Посмотреть сообщение
Нет ну если с геометрией не лады, то тогда можно и так.
К чему это?
Цитата Сообщение от thick_int Посмотреть сообщение
А также предусмотреть ряд предикатных функций, позволяющих делать суждения о том, является ли данный параллелограмм ромбом, прямоугольником и квадратом.
Вот это уже имеет смысл.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ему нужен Класс Параллелограм
Ромб - наследник от параллелограма
Прямоугольник - наследник от параллелограма
Квадрат- наследник от ромба и прямоугольника
+1, наверняка ждут именно этого.
thick_int
Заблокирован
25.04.2012, 21:39     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #24
Да чего тут писать то.
Я сам вот не могу понять, как можно тут строить иерархию в смысле ООП.
Ну вот мы начертили параллелограмм (запустили конструктор класса параллелограмм). Он уже после этого или ромб или прямоугольник или квадрат (или ни то ни другое) без всякого наследования.
Зачем тут награживать огород, пытаясь применять ООП против здравого смысла.

Добавлено через 2 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение
Ему нужен Класс Параллелограм
Ромб - наследник от параллелограма
Прямоугольник - наследник от параллелограма
Квадрат- наследник от ромба и прямоугольника
Это только видимость. На самом деле тут нет никакой иерархии.
Иногда, к сожалению, принципы ООП и здравый смысл идут не в ногу.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.04.2012, 21:44     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #25
Цитата Сообщение от thick_int Посмотреть сообщение
Зачем тут награживать огород, пытаясь применять ООП против здравого смысла.
Просто это учебная задача и о здравом смысле вряд ли задумывались, а мы тут просто льём воду не в тему)
thick_int
Заблокирован
25.04.2012, 21:47     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #26
А если Ваш преподаватель так уж настаивает на множественном наследовании. Ну что ж создайте помимо класса ПАРАЛЛЕЛОГРАММ, еще, например класс МЕТАЛЛ, имеющее одно свойство плотность, а в качестве класса, получаемого наследованием, предложите класс МЕТАЛЛИЧЕСКИЙ ПАРАЛЛЛЕОГРАММ, в котором вычисляется вес оного.
Ну это что-то, имеющее здравый смысл, а не этот интеллектуальный онанизм, которым Вам предлагают заняться.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.04.2012, 21:47     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #27
Цитата Сообщение от AndrK189100 Посмотреть сообщение
Просто, непонятно, зачем тут наследование.
Не морочьте себе голову, не нужно оно тут.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
25.04.2012, 21:54     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #28
Цитата Сообщение от gray_fox Посмотреть сообщение
Не морочьте себе голову, не нужно оно тут.
глупости - это классический пример множественного наследования. Приведи свой, а мы посмотрим как ты понимаешь, зачем и когда оно нужно.
твои предложения enum type{RECT, SQUARE...}
типичное процедурное мышление
thick_int
Заблокирован
25.04.2012, 22:04     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
глупости
Тоже придерживаюсь такого же мнения, что наследование тут абсолютно не нужно.

Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Приведи свой, а мы посмотрим как ты понимаешь, зачем и когда оно нужно
Лучше Вы приведите пример, как Вам удасться унаследовать хотя бы ромб от параллелограмма, не вступая в противоречие со здравым смыслом.

Добавлено через 5 минут
Чтобы упростить Вам задачу, оттолкнитесь от конструктора паралллеограмма, который принимает две соседние стороны и диагональ, соединяющую их необщие концы (Этого достаточно, чтобы построить параллелограмм).
Ваши дальнейшие действия...
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.04.2012, 22:08     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #30
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
твои предложения enum type{RECT, SQUARE...}
типичное процедурное мышление
Звучит как приговор) А пример я привёл, возможно, не совсем корректный. Хотелось сказать, что нет смысла наследовать от параллелограмма ромб и прямоугольник, а потом вводить метод is_square. Ведь достаточно одного класса параллелограмма, а узнать, является ли объект этого класса прямоугольником, ромбом или квадратом, можно с помощью более естественных методов, например, get_width, get_length и get_angle.
thick_int
Заблокирован
25.04.2012, 22:22     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #31
Цитата Сообщение от gray_fox Посмотреть сообщение
Хотелось сказать, что нет смысла наследовать от параллелограмма ромб и прямоугольник
Вот это здравая мысль.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
25.04.2012, 22:23     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #32
Запросто: Ромб обладает всеми свойствами параллелограмма
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
class Parallelogram{
protected:
vec2 centre;
float a;
float b;
float angle
public:
Parallelogram(vec2 position, float sidea, float sideb, float ang);
virtual float get_area(){return a*b*sin(angle);}
 
};
class romboid: public Parallelogram{
public:
romboid(vec2 position, float side, float ang):Parallelogram(position, side, side, ang){};
Circle get_inner_circle(){float rad=sin(angle/2.0)*a*cos(angle/2.0); Circle result(centre, rad); return result;}
}
class rectangle: public Parallelogram{
public:
rectangle(vec2 position, float sidea, float sideb):Parallelogram(position, sidea, sideb, 90.0){};
Circle get_outer_circle(){float rad=sqrt(a*a+b*b)/2.0; Circle result(centre, rad); return result;}
virtual float get_area(){return a*b;}
}
class square:public Parallelogram{
public:
square(vec2 position, float side):rectangle(position, side, side);
virtual float get_area(){return a*a;}
}
thick_int
Заблокирован
25.04.2012, 22:46     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #33
Во-первых в таком виде это не скомпилируется и не запустится, а если и запустится, то все равно это неправильно по причинам, сказанным выше. У меня вот так на вскидку после перекопирования этого текста сразу все в красном цвете.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение

Запросто: Ромб обладает всеми свойствами параллелограмма
Да ромб то обладает, но он обладает ими сразу после того, как Вы вычертите подходящий параллелограмм, а не после того, как Вы начертив параллелограмм, кинитесь его насиловать.

Устал уже от этой дискуссии. Могу только одно сказать, что никакое программирование не может заменить отсутствие знаний по математике, да и просто здравого смысла.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
25.04.2012, 22:53     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #34
Цитата Сообщение от thick_int Посмотреть сообщение
Устал уже от этой дискуссии. Могу только одно сказать, что никакое программирование не может заменить отсутствие знаний по математике, да и просто здравого смысла.
Ну куда уж нам!
За всю дискуссию не привёл ни одного примера множественного наследования. Из чего можно предположить, что ты и сам не знаешь как его применять, а других отговариваешь.
Ведь топикстартеру не столько важен пример именно из геометрии, сколько пример применения какого-либо множественного наследования.
А из твоих ответов я делаю вывод, что ты вообще не знаешь зачем его применять и в случае чего пишешь enum type{////

Добавлено через 3 минуты
Цитата Сообщение от thick_int Посмотреть сообщение
Да ромб то обладает, но он обладает ими сразу после того, как Вы вычертите подходящий параллелограмм, а не после того, как Вы начертив параллелограмм, кинитесь его насиловать.
Кто вообще говорит о том, что что-то где-то чертят? Мы создали функцию, работающую с ромбами. Не важно как, но она использует какие-то параметры, свойственные именно ромбу, например радиус вписанной окружности.
Ты будешь переписывать эту функцию второй раз для работы с квадратами???
thick_int
Заблокирован
25.04.2012, 23:00     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #35
Еще раз говорю, то, что Вы написали, оно во-первых, в таком виде просто нерабочее.
А во-вторых, я сказал студенту приемлемый на мой взгляд выход, так чтобы и множественное наследование было и здравый смысл не попирался.

Ну что толку с такого кода, если только не за тем ШОБ БЫЛО?
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.04.2012, 23:06     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #36
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Запросто: Ромб обладает всеми свойствами параллелограмма
Давайте возьмем аналогичный пример, но попроще. Иерархия прямоугольник <- квадрат. Во-первых, самое очевидное: зачем хранить в объекте квадрата две размерности? Во-вторых, всё это может стать причиной неочевидного поведения, например:
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
#include <cassert>
 
 
struct rectangle {
    rectangle(int width_, int height_) : width(width_), height(height_) {}
 
    int width;
    int height;
};
 
 
struct square : rectangle {
    square(int width) : rectangle(width, width) {}
};
 
 
void change_width(rectangle & rect, int width) {
    rect.width = width;
}
 
 
int main() {
    square sq(4);
    assert(sq.width == sq.height);
    
    change_width(sq, 5);
    assert(sq.width == sq.height);    // fail
}
Возможность изменить ширину прямоугольника, не меняя высоту - вполне логичное свойство, в отличии от квадрата. Наследуя же квадрат от прямоугольника первый наследует так же и поведение второго, в том числе и это свойство. Может быть с точки зрения геометрии квадрат и частный случай прямоугольника, но это ещё ничего не значит.
P.S.: надеюсь я ясно излагаю.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
25.04.2012, 23:34     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #37
Цитата Сообщение от thick_int Посмотреть сообщение
Ну что толку с такого кода, если только не за тем ШОБ БЫЛО?
Какой смысл в 99% задач из этого раздела форума?
Может в том, чтобы научить приёмам программирования??
Если ты никогда не применяешь множественное наследование на практике, это не значит, что оно не нужно. Не значит, что оно нигде не применимо.
И я повторяю просьбу: если ты так уверен, что мн.насл. применяется не в таком случае, выложи свой собственный пример, хоть про геометрию, хоть про алгебру, хоть про ботанику, который ДЕМОНСТРИРОВАЛ бы применение множественного наследования, логичное с твоей точки зрения.

Пример, который бы показал, когда нужно применять мн.насл-е, а не очередную порцию текста.

Добавлено через 3 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение
Возможность изменить ширину прямоугольника, не меняя высоту - вполне логичное свойство, в отличии от квадрата. Наследуя же квадрат от прямоугольника первый наследует так же и поведение второго, в том числе и это свойство.
перегрузи у квадрата функции изменения сторон,
а в прямоугольнике сделай их виртуальными делов то.

Добавлено через 22 минуты
И вообще, взял и разприватил мои protected поля.
И на что после этого жалуешься?
thick_int
Заблокирован
25.04.2012, 23:38     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #38
Ну вот как нибудь так:

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
#include <cmath>
 
class Parallelogram
{
public:
    static double const PI;
    Parallelogram(double a, double b, double ang)
    {
        if (a <= 0) throw invalid_argument("side A must be a positive number");
        if (b <= 0) throw invalid_argument("side B must be a positive number");
        if (ang <= 0 || ang >=  PI) throw invalid_argument("Angle must be lesss than PI");
        sideA = a; sideB = b; angle = ang;
    }
    
    double area() const
    {
        return (sideA * sideB) * sin(angle);
    }
 
private:
    double sideA;
    double sideB;
    double angle;
};
 
double const Parallelogram::PI = 3.14159;
 
class Metall
{
public:
    Metall(double den)
    {
        if (den <= 0)   throw invalid_argument("density be a positive number");
        density = den;
    }
    double get_density() const
    {
        return density;
    }
private:
    double density;
};
 
class MetallicParallelogram : public Parallelogram, public Metall
{
public:
    static enum COLOR {GOLD, SILVER, BRONZE};
    MetallicParallelogram(COLOR c, double a, double b, double ang, double den) : Parallelogram(a, b, ang), Metall(den), color(c) {};
    double weight() const
    {
        return area() * get_density();
    }
private:
    COLOR color;
};
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.04.2012, 23:41     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #39
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
перегрузи у квадрата функции изменения сторон,
а в прямоугольнике сделай их виртуальными делов то.
Так?
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
#include <cassert>
 
 
struct rectangle {
    rectangle(int width, int height) : width_(width), height_(height) {}
 
    int get_width() const {
        return width_;
    }
    virtual void set_width(int width) {
        width_ = width;
    }
    
    int get_height() const {
        return height_;
    }
    virtual void set_height(int height) {
        height_ = height;
    }
    
    virtual ~rectangle() {}
    
private:
    int width_;
    int height_;
};
 
 
struct square : rectangle {
    square(int width) : rectangle(width, width) {}
    
    virtual void set_width(int width) {
        rectangle::set_width(width);
        rectangle::set_height(width);
    }
    
    virtual void set_height(int height) {
        rectangle::set_width(height);
        rectangle::set_height(height);
    }
};
 
 
void change_width(rectangle & rect, int width) {
    rect.set_width(width);
}
 
 
int main() {
    square sq(4);
    assert(sq.get_width() == sq.get_height());
    
    change_width(sq, 5);
    assert(sq.get_width() == sq.get_height());    
}
Скомпилируется, конечно, но... не кажется, что что-то здесь не так?)
И вообще, взял и разприватил мои protected поля.
)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 23:57     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм
Еще ссылки по теме:

Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
C++ Множественное наследование
C++ Множественное наследование

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

Или воспользуйтесь поиском по форуму:
thick_int
Заблокирован
25.04.2012, 23:57     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм #40
И еще класс Parallelogram можнор дополнить вот такими функциями

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool isRomb() const
    {
        return sideA == sideB;
    }
 
    bool isRectangle() const
    {
        return angle == PI / 2;
    }
 
    bool isSquare() const
    {
        return isRomb() && isRectangle();
    }
Yandex
Объявления
25.04.2012, 23:57     Множественное наследование: прямоугольник, квадрат, ромб, параллелограмм
Ответ Создать тему
Опции темы

Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru