

Polymorphism
Čau mám dotaz ohledně polymorfismu,
jaké je reálné využití. Dám příklad
#include <iostream>
using namespace std;
class Shape
{
public:
virtual float GetArea() = 0;
};
class Rectangle : public Shape
{
public:
Rectangle(float a) { this->a = a; }
float GetArea() { return a * a; }
private:
float a;
};
class Circle : public Shape
{
public:
Circle(float r) { this->r = r; }
float GetArea() { return 3.14f * r * r; }
private:
float r;
};
int main()
{
Shape *a = new Circle(1.0f);
Shape *b = new Rectangle(1.0f);
cout << a->GetArea() << endl;
cout << b->GetArea() << endl;
}
Máme tento kód, kde pomocí ukazatele na base třídu přistupujeme k metodám v odvozených třídách.
Mě by zajímalo, jaký to má význam a proč se nepoužije rovnou ukazatel na odvozenou třídu, když
její jméno stejně musíme znát. Může někdo dát prosím praktický příklad nebo říct výhody, proč
se využívá zrovna tenhle přístup. Má to například nižší nároky nebo je to z jiného důvodu? Díky
Dalsi pouziti jsou funkce/procedury, ktere jako parametr deklaruji Shape a neco s nim delaji , ale ty jim posles jednou Circle, jindy Rectangle, jindy jeste neco dalsiho, co jsi dodnes ani nenapsal (treba SpaceShip)
Treba do Shape pridas metody Draw a Hide a SetOrigin a pak muzes napsat funkci
void MoveTo(Shape *a, int x, int y) {a->Hide();a->SetOrigin(x,y);a->Draw();}
a volat MoveTo(myCircle,10,20);
samozrejme ta MoveTo muze byt metodou Shape,
pak bys ji deklaroval pouze v Shape a vsechny ostatni odvozene obrazce by ji dedily a ty bys ji nepotreboval prepisovat pro kazdy typ zvlast.
Takze pak bys mel pole Shapu, tam bys dal ruzne Rectangle, Circle, SpaceShip a cokoli dalsiho a jednim cyklem bys dokazal presunout vsechny ty tvary po obrazovce ...
V programování se sice nevyznám, ale někde sem četl, že polymorfizmus je nejlepší používat u virů. Pak ten soubor viru vypadá pokaždé jinak a antiviráky ho nenajdou.
To je ovšem naprosto jiný polymorfismus.