Kezdőoldal » Számítástechnika » Programozás » Mikor használjak virtuális...

Mikor használjak virtuális függvényeket függvényfelülírás helyett és fordítva? C++

Figyelt kérdés

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?


2012. máj. 16. 23:33
 1/3 2xSü ***** válasza:

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.)

2012. máj. 17. 01:34
Hasznos számodra ez a válasz?
 2/3 iostream ***** válasza:

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.

2012. máj. 17. 09:33
Hasznos számodra ez a válasz?
 3/3 BlekiHU válasza:

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;

2012. máj. 18. 13:04
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!