Mikor használjak virtuális függvényeket függvényfelülírás helyett és fordítva? C++
Első verzió: Függvény felülírás
class Mammal
{
public:
Mammal();
~Mammal();
void Speak()const {cout <<"Mammal beszel \n";}
void Move()const {cout <<"Mammal lep egyet \n";}
protected:
private:
};
class Dog: public Mammal
{
public:
Dog();
~Dog();
void Speak()const {cout <<"Vau,vau \n";}
void Move()const {cout <<"A kutya lep egyet \n";}
protected:
private:
};
class Cat: public Mammal
{
public:
Cat();
~Cat();
void Speak()const {cout <<"Miau,miau \n";}
void Move()const {cout <<"A macska lep egyet \n";}
protected:
private:
};
2 verzió virtuális függvények:
class Mammal
{
public:
Mammal();
~Mammal();
virtual void Speak()const {cout <<"Mammal beszel \n";}
virtual void Move()const {cout <<"Mammal lep egyet \n";}
protected:
private:
};
class Dog: public Mammal
{
public:
Dog();
~Dog();
void Speak()const {cout <<"Vau,vau \n";}
void Move()const {cout <<"A kutya lep egyet \n";}
protected:
private:
};
class Cat: public Mammal
{
public:
Cat();
~Cat();
void Speak()const {cout <<"Miau,miau \n";}
void Move()const {cout <<"A macska lep egyet \n";}
protected:
private:
};
Ugyanaz most akkor mi az istennek vannak a virtuális függvények?
Lásd: [link] -> „Virtuális függvények, polimorfizmus” szakasz
Tehát a te példádnál nincs különbség. Viszont ha pl. a Cat egy példányát castolod Mammal-ra, és úgy hívod meg, akkor különbség van. Sima felülírásnál a Mammal osztály metódusai futnak le, míg virtuális metódusok esetén az adott objektum osztályának metódusai.
Minden létrehozott objektumnak van egy VMT-je (Virtuális Metódus Tábla), ami tartalmazza a virtuális metódusok címét, így bármire is castolod, az adott objektum VMT-jéből fogja venni a meghívandó metódust és nem aszerint fog dönteni, hogy mire castoltad.
(Remélem jól mondom. Nem igazán vagyok gyakorlott C++ -ban.)
Jól mondod, azzal a kitétellel, hogy minden legalább egy virtuális függvénnyel rendelkező osztály objektumának van vt-je (virtuális tábla), nem úgy általában minden objektumnak.
Tehát: Mammal mutatón vagy referencián keresztül hívva a függvényt normáls elfedésnél a Mammal függvényei fognak lefutni minden esetben, virtuális függvénynél pedig az adott alosztály függvényei, ami épp a mutató vagy referencia mögött van.
Virtuális táblája osztályonként van egy. Objektumonként csak egy pointere van az adott táblára.
Amúgy itt a példa, az eredeti kérdésre, hogy hol fogsz változást tapasztalni.
Mammal* mammal = new Dog();
mammal->Speak();
delete mammal;
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!