Dědění
Vytvořte bázovou třídu se společnými vlastnosti pro grafické objetky a zděděné třídy pro objekt bod a line. Ukažte že s objekty těchto různých typů lze pracovat jednotným přístupem v případě, že dědí z bázové třídy.
// dedeni.cpp : Defines the entry point for the console application.
//
#include <iostream.h>
class TGrBase {
protected:
// definice spolecnych promennych
int Index;
public:
// definice spolecneho rozhrani
virtual double MinX(void) = 0;
virtual double MaxX(void) = 0;
virtual void Translace(double xx,double yy) = 0;
virtual void TiskV(char *txt) = 0;
};
class TBod:public TGrBase { // public kvuli prirazeni ukazatele do tgrbase - proc
static int Celkem, Aktualni;
double x,y;
public:
TBod(void) {x=y=0;Celkem++;Aktualni++;Index = Celkem;Tisk(" konstruktor void ");}
TBod(double xx,double yy=0) {x=xx;y=yy;Celkem++;Aktualni++;Index = Celkem;Tisk (" konstruktor x,y ");}
virtual ~TBod(void) {Aktualni--;Tisk(" destruktor ");} // pouze kvuli tisku
double GetX(void) {return x;}
double GetY(void) {return y;}
virtual double MinX(void) {Tisk("Min X");return x;}
virtual double MaxX(void) {Tisk("Max x");return x;}
virtual void Translace(double xx,double yy) {x += xx;y+= yy;Tisk("Translace");}
void Tisk(char *str) { cout << " bod " << Celkem << " " << Aktualni << " " << Index << " / " << x << " , " << y << str << endl;}
virtual void TiskV(char *str) {Tisk(str);}
friend ostream & operator<<(ostream &os, TBod &b);
};
ostream & operator<<(ostream &os, TBod &b)
{
os << " ( " << b.x << " , " << b.y << " ) ";
return os;
}
class TLine:public TGrBase {
static int Celkem,Aktualni;
TBod a,b;
public:
TLine(void) {Celkem++;Aktualni++;Index = Celkem;Tisk(" konstruktor void ");}
TLine(double x1,double y1,double x2,double y2):a(x1,y1),b(x2,y2){Celkem++;Aktualni++;Index = Celkem;Tisk(" konstruktor int,int,int,int ");}
TLine(TBod &aa,TBod &bb) {a=aa;b=bb;Celkem++;Aktualni++;Index = Celkem;Tisk(" konstruktor TBod,TBod ");}
virtual ~TLine(void ){Aktualni--;Tisk(" destruktor ");}
double MinX(void) {Tisk("Min X");return a.GetX() < b.GetX() ? a.GetX() : b.GetX(); }
double MaxX(void) {Tisk("Max X");return a.GetX() > b.GetX() ? a.GetX() : b.GetX(); }
void Tisk(char *str) { cout << " line " << Celkem << " " << Aktualni << " " << Index << " / " << a << " , " << b << str<< endl;}
virtual void TiskV(char *str) { cout << " line " << Celkem << " " << Aktualni << " " << Index << " / " << a << " , " << b << str<< endl;}
virtual void Translace(double xx,double yy) {a.Translace(xx,yy);b.Translace(xx,yy);Tisk("Translace");}
};
int TBod::Aktualni=0;
int TBod::Celkem = 0;
int TLine::Aktualni=0;
int TLine::Celkem = 0;
void f(void)
{
TBod bod,b2(2,4);
TLine line,l2(1,2,3,4),l3(bod,b2);
TLine *l4;
l4 = (TLine*) new TBod(10,10); // pokud pracujeme s virtual funkcemi, pak je
// dulezite, jak prvek vznikl a ne ceme je prirazen (musi respektovat dedicnost)
#define PRVKU 6
TGrBase *pole[PRVKU] = {&bod,&line,&b2,&l2,&l3,l4};
int i;
double MinX=1e32,MaxX = -1e32;
for (i=0;i<PRVKU;i++)
{
if (pole[i]->MinX() < MinX)
MinX = pole[i]->MinX();
if (pole[i]->MaxX() > MaxX)
MaxX = pole[i]->MaxX();
}
cout << " minimum x = " << MinX << "\n";
cout << " maximum x = " << MaxX << "\n";
for (i=0;i<PRVKU;i++)
pole[i]->Translace(3.5,-4);
MinX=1e32;
MaxX = -1e32;
for (i=0;i<PRVKU;i++) {if (pole[i]->MinX() < MinX) MinX = pole[i]->MinX();
if (pole[i]->MaxX() > MaxX) MaxX = pole[i]->MaxX();}
cout << " minimum x = " << MinX << "\n";
cout << " maximum x = " << MaxX << "\n";
l4->Tisk(" line jako bod "); // neni virtualni a proto si mysli, ze je to line
l4->TiskV(" line jako bod virtual "); // virtualni se vola podle vzniku tj. bod
delete l4; // neni-li destructor virtual, zavola se destruktor od line, protoze
// prekladac vi, ze je to line. U virtual respektuje ze to vzniklo jako bod
}
int main(int argc, char* argv[])
{
char c;
f();
cin >> c;
return 0;
}