Mi az a többalakúság?





Hát nem nagyon értem...
Próbálgatom...










Utóirat:
"kiirva" helyett, megvalósítva...





A virtual kulcsszó arra utal hogy nem fordítási időbe dől el a hogy az adott objektumhoz melyik metódus kerül (a virtualra vonatkozik) hanem futási időbe, ehhez virtuális függvénytáblával van megvalósítva, ezek vannak karbantartva a háttérbe, ekkor az osztály minden egyes példányához tartozik egy ilyen. Akár mindig kiírhatjuk mindig a virtual kulcsszót, de ez plussz overhead.
---------------
Az objektumra legálisan hivatkozhatunk ősosztályaként (ez nem mindig igaz, bonyolultabb ennél a c++), pl a kutyát kezelhetem úgy mint emlőst anélkül hogy tudnám. Ekkor ha meghívom rá az eszik metódust akkor, a kutya osztályba felüldefiniált metódus hívódik meg ha az virtual. Ha nem akkor az emlős osztályé. A kutyából származtatott metódusok továbbra is virtuálisak maradnak ha az ősosztályba azok voltak.
pl:
#include<iostream>
using namespace std;
class Emlos{
public:
virtual void eszik(){
cout << "Emlos eszik." << endl;
}
};
class Kutya:public Emlos{
public:
void eszik(){
cout << "Kutya eszik." << endl;
}
};
class Puli:public Kutya{
public:
void eszik(){
cout << "Puli kutya eszik." << endl;
}
};
int main(){
Emlos* e1=new Emlos;
Emlos* e2=new Kutya;
Emlos* e3=new Puli;
Kutya* k1=new Kutya;
Kutya* k2=new Puli;
Puli* p=new Puli;
//Puli* p=new Kutya; //szintaktikai hiba lenne
e1->eszik();
e2->eszik();
e3->eszik();
k1->eszik();
k2->eszik();
p->eszik();
delete e1;
delete e2;
delete e3;
delete k1;
delete k2;
delete p;
return 0;
}
Ki lehet próbálni virtual nélkül is.
------------------
Egyébként az kimaradt hogy többalakúság van osztályok szintjén kívül is, 2 függvénynek lehet pontosan ugyan az a neve, egyértelműen azonosít egy függvényt a paraméterlistája és a neve, nyilván 2 eltérő paraméterlistájú függvény lehet azonos nevű (egyazon névtérbe). Ugyanez osztályok metódusára is igaz.





Szívesen,azt hozzá kell tenni hogy az ősosztályban lehet olyan metódus amit tegnap 18:50-kor írtál ez az un. pure virtual
A tegnapi példánál maradva virtual void eszik() = 0; az emlős oszályban.
Ekkor szintaktikai hiba az Emlos* e1=new Emlos.
A teljesség kedvéért megemlítem hogy van többszörös öröklődés c++ -ban, több osztályból származhat egy osztály, de ez kezdőknek nem ajánlott, sőt olyan szinten el tudja bonyolítani az öröklődési hierarchiát, hogy nem vált be inkább kifele vezetik a nyelvből, a fordító is figyelmeztet (bár lefordítja) hogy ne használd.
Pl van a Földi és van a Vízi járművek osztály. E kettőből származtatunk egy kétéltű járművek osztályt, de mind2 ősben van kormányoz metódus ekkor el akar fordulni egyik jobbra a másikkal lehet balra fordulna, ekkor ki tudja mit csinál, meg rengeteg probléma felmerül ami egyszeres öröklődésnél nem.
További kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!