Лабораторна робота №5
Тема: Множине наслідування в С++.
Мета роботи: Освоєння множинного наслідування в С++ і вирішення проблем, які з’являються при такому наслідуванні.
1.Індивідуальне завдання.
Додати в ієрархію класів лабораторної роботи №5 клас по свому вподобанню, але таким чином, щоб реалізувати наступну схему наслідування.
/ Клас 3 \
Клас 1 -> Клас 2 Клас 5
. \ Клас 4 /
Завдання: крапка -> трикутник -> трикутник у трикутнику->коло у трикутнику та трикутнику.
2.Текст програми.
#include <graphics.h> // graphics library declarations
#include <conio.h> // for getch() function
#include <stdlib.h> // for randomize() function
#include <dos.h> // for delay() function
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
#include <math.h>
void main();
class CPoint
{
public:
int x,y,r;
CPoint(void){};
void Init(int IX, int IY, int IR);
virtual void Show();
virtual void Hide();
void Zoom(int DR);
void Move(int DX, int DY, int DR);
};
class CTtreyg: public CPoint
{
public:
CTtreyg(void){};
virtual void Show(void);
virtual void Hide(void);
};
class CTtrInCir: virtual public CTtreyg
{
public:
CTtrInCir(void){};
virtual void Show(void);
virtual void Hide(void);
};
class CSq : virtual public CTtreyg
{
public:
CSq(void){};
virtual void Show(void);
virtual void Hide(void);
};
class CSqCir : public CTtrInCir, public CSq
{
public:
CSqCir(void){};
virtual void Show(void);
virtual void Hide(void);
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CPoint::Init(int IX, int IY, int IR)
{
x=IX;
y=IY;
r=IR;
};
void CPoint::Show(void)
{
putpixel(x,y, 14);
};
void CPoint::Hide(void)
{
putpixel(x,y, 0);
};
void CPoint::Zoom(int DR)
{
r=r+DR;
};
void CPoint::Move(int DX, int DY, int DR)
{
Hide();
x+= DX;
y+= DY;
Zoom(DR);
Show();
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CTtreyg::Show()
{
setcolor(11);
line(x,y-r,x+r*sqrt(3)/2,y+r/2);
line(x+r*sqrt(3)/2,y+r/2,x-r*sqrt(3)/2,y+r/2);
line(x-r*sqrt(3)/2,y+r/2,x,y-r);
};
void CTtreyg::Hide()
{
setcolor(0);
line(x,y-r,x+r*sqrt(3)/2,y+r/2);
line(x+r*sqrt(3)/2,y+r/2,x-r*sqrt(3)/2,y+r/2);
line(x-r*sqrt(3)/2,y+r/2,x,y-r);
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CTtrInCir::Show()
{
setcolor(13);
line(x,y-r,x+r*sqrt(3)/2,y+r/2);
line(x+r*sqrt(3)/2,y+r/2,x-r*sqrt(3)/2,y+r/2);
line(x-r*sqrt(3)/2,y+r/2,x,y-r);
line(x,y+r/2,x-(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(r-(r/2)*(sqrt(3)/2),y-(r/2)/2,x+(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x+(r/2)*(sqrt(3)/2),y-(r/2)/2,x,y+r/2);
};
void CTtrInCir::Hide()
{
setcolor(0);
line(x,y-r,x+r*sqrt(3)/2,y+r/2);
line(x+r*sqrt(3)/2,y+r/2,x-r*sqrt(3)/2,y+r/2);
line(x-r*sqrt(3)/2,y+r/2,x,y-r);
line(x,y+r/2,x-(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x-(r/2)*(sqrt(3)/2),y-(r/2)/2,x+(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x+(r/2)*(sqrt(3)/2),y-(r/2)/2,x,y+r/2);
};
//--------------------------------------------------------}
//--------------------------------------------------------}
void CSqCir::Show()
{
setcolor(17);
line(x,y-r,x+r*sqrt(3)/2,y+r/2);
line(x+r*sqrt(3)/2,y+r/2,x-r*sqrt(3)/2,y+r/2);
line(x-r*sqrt(3)/2,y+r/2,x,y-r);
line(x,y+r/2,x-(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x-(r/2)*(sqrt(3)/2),y-(r/2)/2,x+(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x+(r/2)*(sqrt(3)/2),y-(r/2)/2,x,y+r/2);
circle(x,y, r/4);
};
void CSqCir::Hide()
{
setcolor(0);
line(x,y-r,x+r*sqrt(3)/2,y+r/2);
line(x+r*sqrt(3)/2,y+r/2,x-r*sqrt(3)/2,y+r/2);
line(x-r*sqrt(3)/2,y+r/2,x,y-r);
line(x,y+r/2,x-(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x-(r/2)*(sqrt(3)/2),y-(r/2)/2,x+(r/2)*(sqrt(3)/2),y-(r/2)/2);
line(x+(r/2)*(sqrt(3)/2),y-(r/2)/2,x,y+r/2);
circle(x,y, r/4);
};
void main(void)
{
// initialize the graphics system
int i;
int graphdriver = DETECT, graphmode;
initgraph(&graphdriver, &graphmode, "c:\\dosapp\\borlandc\\bgi");
cleardevice();
randomize();
CPoint Point[5];
CTtreyg Ttreyg[5];
CTtrInCir TtrInCir[5];
CSq Sq[5];
CSqCir SqCirs[5];
for (i=0;i<5;i++)
{
Point[i].Init(200+random(100),150+random(100),0);
Point[i].Show();
Ttreyg[i].Init(100+random(200),50+random(200),20);
Ttreyg[i].Show();
TtrInCir[i].Init(300+random(200),100+random(200),30);
TtrInCir[i].Show();
Sq[i].Init(250+random(200),200+random(200),40);
Sq[i].Show();
SqCirs[i].Init(250+random(200),200+random(200),40);
SqCirs[i].Show();
}
while(!kbhit())
{
for (int i=0;i<5;i++)
{
Point[i].Move(1,0,2-random(5));
Ttreyg[i].Move(1,1,2-random(5));
TtrInCir[i].Move(-1,1,2-random(5));
Sq[i].Move(-1,-1,2-random(5));
SqCirs[i].Move(0,1,2-random(5));
}
delay(40);
}
closegraph();
}
3. Результати виконання.
Отримали зображення: крапка -> трикутник -> трикутник у трикутнику->коло у трикутнику та трикутнику.
Висновок: Проаналізували проблему неоднозначності і вирішити її з допомогою використання віртуальних класів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.