Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
1

Наследование ромба от квадрата

20.09.2014, 15:23. Просмотров 1024. Ответов 18
Метки нет (Все метки)

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


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
class TKvadr : public TPoint
{
public:
    int dx1,dy1,dx2,dy2;
    TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor);
    void Draw(int c);
void changecolor(int c);
 
};
 
 
 
TKvadr::TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor):TPoint(ix1, iy1, icolor)
{
x1=ix1;
y1=iy1;
width=ix2-x1;
height=iy2-y1;
x1=y1;
width=height;
}
void TKvadr::Draw  (int c){
setcolor(c);
rectangle (x1,y1,x1+width,y1+height);
}
void TKvadr::changecolor(int c)
{
    color=c;
    Draw(color);
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2014, 15:23
Ответы с готовыми решениями:

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

Множественное наследование в форме ромба
Всем привет. Объясните пожалуйста почему так происходит: есть некое древо иерархии классов в виде...

Даны две диагонали ромба. Вычислить площадь и периметр этого ромба
Помогите написать программу, с кодом BORLANDC

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

18
Tulosba
:)
Эксперт С++
4762 / 3256 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2014, 15:39 2
Цитата Сообщение от kira_1 Посмотреть сообщение
как реализовать наследование ромба от квадрата.
Ромб не является квадратом. Стало быть и о наследование не может быть речи.
1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 15:48  [ТС] 3
У меня такое задание. Например, наследование прямоугольника от квадрата :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TRect : public TKvadr
{
public:
    TRect(int ix1, int iy1, int ix2, int iy2, int icolor);
    void Draw(int c);
 
};
 
 
TRect::TRect(int ix1, int iy1, int ix2, int iy2, int icolor):TKvadr(ix1, iy1, ix2, iy2, icolor){
width = ix2-x1;
height = iy2-y1;
}
void TRect::Draw  (int c){
setcolor(c);
rectangle (x1,y1,x1+width,y1+height);
};
Добавлено через 1 минуту
Я понимаю, что странное задание и так никто не делает, но требование преподавателя.
0
Tulosba
:)
Эксперт С++
4762 / 3256 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2014, 15:52 4
Цитата Сообщение от kira_1 Посмотреть сообщение
наследование прямоугольника от квадрата :
Ну это тоже в корне неверно. Прямоугольник вовсе не обязан быть квадратом, т.к. может иметь разные длины смежных сторон.
Суть наследования, чтобы производный класс как минимум обеспечивал всё то, что может обеспечивать базовый.

Добавлено через 45 секунд

Не по теме:

Цитата Сообщение от kira_1 Посмотреть сообщение
и так никто не делает, но требование преподавателя.
А если он попросит спрыгнуть с 10 этажа? Может он как раз хотел бы, чтобы Вы ему это объяснили, что такое наследование бессмысленно.

1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 16:00  [ТС] 5
Я понимаю и я с Вами согласна, но мне нужно сдать лабораторную работу и я спрашивала на счет того что так не делается. Сказали, все равно нужно таким образом реализовать. Так что мне нужно сделать "неправильное наследование" по типу прямоугольника, но я не знаю как это сделать.
0
IrineK
Заблокирован
20.09.2014, 16:00 6
Если у вас прямоугольник, ромб и квадрат, то квадрат является одновременно прямоугольником и ромбом.
Наследование нужно строить на этом факте.
1
КОП
990 / 696 / 203
Регистрация: 15.08.2010
Сообщений: 1,962
Завершенные тесты: 2
20.09.2014, 16:03 7
kira_1, создайте новый класс ромб, квадрат в приватные наследники, пусть он там сидит сколько угодно, снаружи его не должно быть видно, ромб не должен от него зависеть. Честь сохранена, наследование есть. Как-то так.
1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 16:08  [ТС] 8
Прямоугольник - это квадрат, в котором изменены стороны (не равны):
C++
1
rectangle (x1,y1,x1+width,y1+height);
Значит, ромб - это квадрат, в котором углы не по 90 градусов (не равны). Подскажите, пожалуйста, как это реализоать в коде.

Добавлено через 2 минуты
КОП, подскажите, пожалуйста, как это записать в коде.
0
Tulosba
:)
Эксперт С++
4762 / 3256 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.09.2014, 16:15 9

Не по теме:

Цитата Сообщение от kira_1 Посмотреть сообщение
Прямоугольник - это квадрат, в котором изменены стороны
Война — это мир
Свобода — это рабство
Незнание — сила
А круг - это квадрат, у которого сторон немного больше, чем 4.

1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 16:20  [ТС] 10
У меня так реализовано наследование прямоугольника от квадрата и программа работает. Я понимаю, что очень странное и не логичное задание. Поэтому я и не знаю как его реализовать.
0
Tulosba
20.09.2014, 16:24
  #11

Не по теме:

kira_1, если не секрет, где дают такие задания, что за учебное заведение?

0
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 16:25  [ТС] 12
Tulosba, я с Вами согласна Но как-то мне надо это сделать
0
КОП
990 / 696 / 203
Регистрация: 15.08.2010
Сообщений: 1,962
Завершенные тесты: 2
20.09.2014, 16:26 13
Цитата Сообщение от kira_1 Посмотреть сообщение
Прямоугольник - это квадрат, в котором изменены стороны (не равны):
Ромб (др.-греч. ῥόμβος, лат. rombus «бубен») — это параллелограмм, у которого все стороны равны[1]. Ромб с прямыми углами называется квадратом.

Но опустим эти мелочи.
Цитата Сообщение от kira_1 Посмотреть сообщение
как это записать в коде
По шагам:
1. Забыли про квадрат
2. Реализуем ромб (в конструкторе к примеру координаты противоположных углов и угол при вершине)
3. Добавляем после class romb : private Kvadr
4. Теперь используя ромб квадрат остается абсолютно невидим.
5. Возникнет проблема с приведением типов и прочие мелочи, но т.к. принцип наследования неправильный, то и приведение не должно работать. Забиваем на проблему.
6. Ромб реализован, квадрат в наследниках, препод довольный, препода на мыло.
1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 17:42  [ТС] 14
Tulosba, как-то не хочется родной вуз позорить и называть его, но и правда такое задание дали.

Добавлено через 1 час 15 минут
Подскажите, пожалуйста, что исправить:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
#include <GRAPHICS.H>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <iostream.h> using namespace std;
 
 
class TShape
{
protected:
int x1, y1, color, height, width;
public:
    TShape(int ix1, int iy1, int icolor);
    ~TShape();
    virtual void Draw(int c)=0;
    void Show();
    void Hide();
    void changecolor(int c);
    void Move(int dx, int dy);
    void Size(char ch);
 
 
};
 
 
 
TShape::TShape(int ix1, int iy1, int icolor)
{
    x1 = ix1;
    y1 = iy1;
    color = icolor;
 
};
 
 
 
TShape::~TShape()
{
};
 
 
void TShape::Show()
{
 
    Draw(color);
}
 
 
 
void TShape::Hide()
{
setfillstyle(1,0);
    Draw(BLACK);
};
 
 
void TShape::Move(int dx, int dy)
{
    Hide();
    x1+=dx;
    y1+=dy;
    Show();
 
};
 
void TShape::Size(char ch)
{
Hide();
if(ch=='B')
{
width+=5;
height+=5;
}
if(ch=='b')
{
width-=5;
height-=5;
}
Show();
};
 
void TShape::changecolor(int c)
{
    color=c;
    Draw(color);
}
 
 
 
 
class TPoint : public TShape
{
public:
    TPoint(int ix1, int iy1, int icolor);
    void Draw(int c);
};
 
 
TPoint::TPoint(int ix1, int iy1, int icolor):TShape(ix1, iy1, icolor)
{
};
 
 
 
void TPoint::Draw(int c)
{
  putpixel(x1, y1, c);
};
 
 
 
class T30Points : public TPoint
{
public:
    T30Points(int ix1, int iy1, int ia, int icolor);
    void Draw(int c);
    void changecolor(int c);
    int a;
};
 
T30Points::T30Points(int ix1, int iy1, int ia, int icolor):TPoint(ix1, iy1, icolor)
{
    a=ia;
};
 
 
void T30Points::Draw(int c)
{
int i,j;
    for(i=0;i<6;i++)
    for(j=0;j<5;j++)
    putpixel(x1+i*a,y1+j*a,c);
};
 
 
 
class TKvadr : public TPoint
{
public:
    int dx1,dy1,dx2,dy2;
    TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor);
    void Draw(int c);
void changecolor(int c);
 
};
 
 
 
TKvadr::TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor):TPoint(ix1, iy1, icolor)
{
x1=ix1;
y1=iy1;
width=ix2-x1;
height=iy2-y1;
x1=y1;
width=height;
}
void TKvadr::Draw  (int c){
setcolor(c);
rectangle (x1,y1,x1+width,y1+height);
}
void TKvadr::changecolor(int c)
{
    color=c;
    Draw(color);
}
 
 
 
 
class TRect : public TKvadr
{
public:
    TRect(int ix1, int iy1, int ix2, int iy2, int icolor);
    void Draw(int c);
 
};
 
 
TRect::TRect(int ix1, int iy1, int ix2, int iy2, int icolor):TKvadr(ix1, iy1, ix2, iy2, icolor){
width = ix2-x1;
height = iy2-y1;
}
void TRect::Draw  (int c){
setcolor(c);
rectangle (x1,y1,x1+width,y1+height);
};
 
 
 
class TRomb : private TKvadr
{
public:
    TRomb(int ix1, int iy1,int ia, int icolor);
    void Draw(int c);
    int a;
};
 
 
TRomb::TRomb(int ix1, int iy1,int ia, int icolor):TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor)
{
    a=ia;
};
 
 
void TRomb::Draw(int c)
{
    setcolor(c);
    line(x1+a+a,y1+a+a,x1+a,y1+a);
    line(x1+a,y1+a,x1+a+a,y1+a-a);
    line(x1+a+a,y1+a-a,x1+a+a+a,y1+a-a+a);
    line(x1+a+a+a,y1+a-a+a,x1+a+a,y1+a+a);
};
 
 
 
 
 
int main()
{
 
    int graphdriver = DETECT, graphmode;
 
 
initgraph(&graphdriver, &graphmode, "C:\\BORLANDC\\BGI");
    char ch;
    TShape *A[5];
    A[0]= new TPoint(200, 200, 3);
    A[1]= new TKvadr(320, 240, 400, 300, 13);
    A[2]= new TRect(320, 240, 400, 300, 13);
    A[3]= new TRomb(320, 240, 40, 13);
    A[4] = new T30Points(320, 240, 40, 13)  ;
 
 
cout<<" \n To show the figure use \n k  square, \n r  rectangle, \n  g   rhomb, \n t   30 dots \n \n to hide the figure use  h \n \n to move use 2,4,6,8 \n \n press q to exit \n use c to change the color \n use b to change the size \n ";
 
    int t=0,i;
    while(1)
    {
    ch=getch();
    if(ch=='q')
    {
        break;
    }
    if(ch=='p')
    {
        A[t]->Hide();
        t=0;
        A[0]->Show();
 
    }
    if(ch=='h')
    {
        A[t]->Hide();
 
    }
    if(ch=='k')
    {
        A[t]->Hide();
        t=1;
        A[t]->Show();
    }
    if(ch=='r')
    {
        A[t]->Hide();
        t=2;
        A[t]->Show();
    }
    if(ch=='g')
    {
        A[t]->Hide();
        t=3;
        A[t]->Show();
    }
                if(ch=='t')
                {
                           A[t]->Hide();
                           t=4;
                           A[t]->Show();
                }
    if(ch=='8')
    {
        A[t]->Move(0,-5);
    }
    if(ch=='2')
    {
        A[t]->Move(0,5);
    }
    if(ch=='4')
    {
        A[t]->Move(-5,0);
    }
    if(ch=='6')
    {
        A[t]->Move(5,0);
    }
    if(ch=='c')
    {
        A[t]->changecolor(random(15));
    }
    if(ch=='b' || ch=='B')
    {
      A[t]->Size(ch);
    }
    }
 
    closegraph();
    return 0;
}
Код, где описан ромб:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TRomb : private TKvadr
{
public:
    TRomb(int ix1, int iy1,int ia, int icolor);
    void Draw(int c);
    int a;
};
 
 
TRomb::TRomb(int ix1, int iy1,int ia, int icolor):TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor)
{
    a=ia;
};
 
 
void TRomb::Draw(int c)
{
    setcolor(c);
    line(x1+a+a,y1+a+a,x1+a,y1+a);
    line(x1+a,y1+a,x1+a+a,y1+a-a);
    line(x1+a+a,y1+a-a,x1+a+a+a,y1+a-a+a);
    line(x1+a+a+a,y1+a-a+a,x1+a+a,y1+a+a);
};
0
КОП
990 / 696 / 203
Регистрация: 15.08.2010
Сообщений: 1,962
Завершенные тесты: 2
20.09.2014, 18:44 15
kira_1, а что не работает?

по сути ошибок куча, начиная от
Цитата Сообщение от kira_1 Посмотреть сообщение
#include <iostream.h> using namespace std;
в одной строке и до отсутствия у квадрата виртуальной функции отрисовки.

Кроме того, т.к. наконец то виден весь код, становится ясно, что мой вариант тут не прокатит.
Предложу другой:
Квадрат - наследник класса фигуры, у которого задаются начальные координаты и длина стороны (возможно угол наклона)
Ромб - его наследник (как обычно через public можно), у которого дополнительно появляется параметр угла, (угол наклона, если таковой был у квадрата, тоже можно использовать, либо пусть фигуры будут "вертикальными") Так же у него переопределена функция отрисовки, которая будет учитывать угол между сторонами.
Кстати, теперь отчасти можно понять идею препода в таком виде: есть стандартный класс квадрат, а ромб расширяет возможности класса квадрат.

отдельно премию за
Цитата Сообщение от kira_1 Посмотреть сообщение
y1+a-a
и тому подобные конструкции
1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
20.09.2014, 19:07  [ТС] 16
Спасибо. Буду пробовать. Программа у меня работала правильно, за исключением того, что ромб был наследником TShape. Функция отрисовки и так инициализируется как виртуальная:
C++
1
virtual void Draw(int c)=0;
Или ее каждый раз задавать как virtual void Draw(int c)?
И получается, что нельзя использовать функцию rectangle(), нужно рисовать все фигуры по другому. Подскажите, пожалуйста, пример, где функция отрисовки учитывает угол.
0
КОП
990 / 696 / 203
Регистрация: 15.08.2010
Сообщений: 1,962
Завершенные тесты: 2
20.09.2014, 19:15 17
Цитата Сообщение от kira_1 Посмотреть сообщение
Подскажите, пожалуйста, пример, где функция отрисовки учитывает угол.
это уже чисто геометрия пошла, попробуйте на бумажке нарисовать ромб, и зная координаты нижней, к примеру, вершины, длину стороны и угол составить формулу. я слишком ленив для этого)

Цитата Сообщение от kira_1 Посмотреть сообщение
И получается, что нельзя использовать функцию rectangle()
для ромба нет, для прямоугольника с квадратом можно, но как я сказал выше, они всегда будут ориентированы "вертикально", нельзя будет их наклонить.
1
kira_1
0 / 0 / 2
Регистрация: 16.11.2013
Сообщений: 59
21.09.2014, 21:00  [ТС] 18
Скажите, пожалуйста, я правильно поняла Вашу идею:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class TRomb : public  TKvadr// класс ромб – наследник класса квадрат
{
public:
    TRomb (int ix1, int iy1, int icolor, float t, int a); // добавляем угол и сторону, убираем координаты второй вершины
    void Draw(int c);
    int a;
};
 
 
TRomb::TRomb(int ix1, int iy1, int icolor, int a,  float t):TKvadr(int ix1, int iy1, int ix2, int iy2, int icolor)  //
{
    a=ia;
};
void TRomb::Draw(int c)
{
    setcolor(c);
    line(x1-a*sin(t/2),y1+cos(t/2),x1,y1+a*cos(t/2));  //рисуем по двум точкам сторону – учитываем угол и длину стороны
    line(x1,y1+a*cos(t/2),x1+a*sin(t/2),y1+a*cos(t/2));
    line(x1+a*sin(t/2),y1+a*cos(t/2),x1,y1);
    line(x1,y1,x1-a*sin(t/2),y1+a*cos(t/2));
};
Только вот у квадрата нужно знать координаты 2 вершин, а у ромба - только одной. Можно ли просто убрать из переменных координаты второй вершины? И, получается, мне нужно переопределить функцию изменение размера для ромба.
0
КОП
990 / 696 / 203
Регистрация: 15.08.2010
Сообщений: 1,962
Завершенные тесты: 2
21.09.2014, 21:25 19
Цитата Сообщение от kira_1 Посмотреть сообщение
Только вот у квадрата нужно знать координаты 2 вершин
одной вершины и длину стороны (вторая будет (x1+a, y1+a)), для ромба можно лишь угол добавить.
Но для удобства вычислений можете хоть все 4 вершины в конструктор требовать. Главное, чтобы работало.
1
21.09.2014, 21:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2014, 21:25

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

Площадь квадрата равна S. Вычислить сторону квадрата а, диагональ d и площадь S1 описанного около этого квадрата круга
Напишите код в C++ Пожалуйста :confusion:

Шифровать методом Магического квадрата (размер квадрата 9х9) С++
Шифровать методом Магического квадрата (размер квадрата 9х9) С++ Дана таблица 9х9. Надо...

Разбить матрицу на квадраты размером 3х3; в центре каждого квадрата поместить сумму прочих элементов квадрата
Есть задача: Заполнить матрицу случайными числами. Разбить матрицу на квадраты размером 3х3. В...

Массивы. Заполнить, разбить на квадраты размером 3х3. В центре каждого квадрата поместить сумму остальных элементов квадрата
Помогите уважаемые программисты написать &quot;Заполнить матрицу случайными числами. Розбить матрицу на...


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

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

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