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

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

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

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

25.04.2012, 18:12. Просмотров 5102. Ответов 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++
разработайте алгоритм и создайте программы с применением множественного наследования. При выполнении данного задания необходимо создать не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
thick_int
Заблокирован
25.04.2012, 22:22 #31
Цитата Сообщение от gray_fox Посмотреть сообщение
Хотелось сказать, что нет смысла наследовать от параллелограмма ромб и прямоугольник
Вот это здравая мысль.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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;}
}
0
thick_int
Заблокирован
25.04.2012, 22:46 #33
Во-первых в таком виде это не скомпилируется и не запустится, а если и запустится, то все равно это неправильно по причинам, сказанным выше. У меня вот так на вскидку после перекопирования этого текста сразу все в красном цвете.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение

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

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

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

Ну что толку с такого кода, если только не за тем ШОБ БЫЛО?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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.: надеюсь я ясно излагаю.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
25.04.2012, 23:34 #37
Цитата Сообщение от thick_int Посмотреть сообщение
Ну что толку с такого кода, если только не за тем ШОБ БЫЛО?
Какой смысл в 99% задач из этого раздела форума?
Может в том, чтобы научить приёмам программирования??
Если ты никогда не применяешь множественное наследование на практике, это не значит, что оно не нужно. Не значит, что оно нигде не применимо.
И я повторяю просьбу: если ты так уверен, что мн.насл. применяется не в таком случае, выложи свой собственный пример, хоть про геометрию, хоть про алгебру, хоть про ботанику, который ДЕМОНСТРИРОВАЛ бы применение множественного наследования, логичное с твоей точки зрения.

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

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

Добавлено через 22 минуты
И вообще, взял и разприватил мои protected поля.
И на что после этого жалуешься?
0
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;
};
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 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 поля.
)))
0
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();
    }
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
26.04.2012, 00:00 #41
Цитата Сообщение от gray_fox Посмотреть сообщение
Скомпилируется, конечно, но... не кажется, что что-то здесь не так?)
Не знаю, ща попробую в студии проектик создать с ним. Там ошибки? Вроде только всяких мелочей не хватает вроде точек с запятой. Ща, узнаю, что не так.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
26.04.2012, 00:05 #42
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не знаю, ща попробую в студии проектик создать с ним. Там ошибки? Вроде только всяких мелочей не хватает вроде точек с запятой. Ща, узнаю, что не так.
Вообще должно. И выполниться корректно должно. Я не это имел ввиду. Просто вы не считаете, что такой дизайн немного кривоват?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
26.04.2012, 00:06 #43
Цитата Сообщение от thick_int Посмотреть сообщение
И еще класс Parallelogram можнор дополнить вот такими функциями
Круто, а когда ты создашь какую-нибудь функцию для работы с ромбами
вроде хитрого определения пересечения сторон с вписанной окружностью второго ромба
bool IsThere_Intersection_Of_InnerCircleOfRomb1_With_Diagonal_Of_Romb2(Romboid* item1, Romboid* item2);

То не сможешь передавать ей квадраты. И придётся копипастить ещё 2 функции
bool IsThere_Intersection_Of_InnerCircleOfSquare1_With_Diagonal_Of_Romb2(Square* item1, Romboid* item2);
bool IsThere_Intersection_Of_InnerCircleOfSquare1_With_Diagonal_Of_Square2(Square* item1, Square* item2);
0
thick_int
Заблокирован
26.04.2012, 00:09 #44
Пока ничего не понял. Просто по русски скажите, в чем могут быть проблемы.
Просто скажите, какая задача вызовет трудности?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
26.04.2012, 00:18 #45
Ты создал функцию, которая принимает указатель на 2 ромба и делает с ним какое-то действие, свойственное только ромбам.
Например находит точку пересечения их вписанных окружностей.
Для прямоугольника это бессмысленно, а для ромба можно.

Теперь у тебя есть два квадрата. Они унаследовали такое св-во ромба, как вписанная окр-ть
Будешь ли ты писать две новых функции для выполнения этого алгоритма между квадратами
и между ромб и квадратом?????

Или воспользуешься наследованием???
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2012, 00:18
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.04.2012, 00:18
Ответ Создать тему
Опции темы

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