Kezdőoldal » Számítástechnika » Programozás » Megerősítést szeretnék, hogy...

Megerősítést szeretnék, hogy jól tudom e?

Figyelt kérdés

Ha deklarálok egy osztályban egy virtuális függvényt és létrehozom ennek egy objektumát,akkor a létrehozott objektumnak virtuális a típusa.

Ez így van?


Amikor létrejön egy ilyen virtuális típusú objektum akkor ennek az objektumnak a típúsának lesz egy V táblázata.Az az létrehoz egy V táblázatot(virtuális táblázatot).

1.Ezt jól tudom?


A class al létrehozott típusnak lesz egy V táblázata vagy a példányosított objektumnak?

Az elsőre tippelek mert szerintem az objektumnak csak egy vptr mutatója lesz ami a virtuális típusban levő V táblázatra mutat.

2.Jól tudom?


Ez után bázisosztályban a példányosított objektum vptr mutatója úgy inicializálódik,hogy a virtuális típus V táblázatán át az osztály virtuális típusú metódusaira fog mutatni.

3.Jól tudom?


És amikor már létrejött a virtuális objektum származtatott osztálya is akkor a vptr úgy korrigálódik,hogy a bázisosztály felülírt metódusaira mutasson.

Jól tudom?


2012. jún. 23. 01:58
 1/4 iostream ***** válasza:

Hát, kicsit zavaros, de amúgy igen, nagyjából így történik. Nincs olyan, hogy virtuális típus, olyan van, hogy dinamikus típus, de ez egy változónak van, nem egy objektumnak, egy objektumnak mindig egy konkrét típusa van. A bázisosztályra mutató pointernek van dinamikus típusa, ami azt jelöli, hogy ténylegesen milyen objektumra mutat.


Természetesen a v-tábla az osztályban jön létre, miért jönne létre minden objektumhoz, az nagy pazarlás lenne.


"Ez után bázisosztályban a példányosított objektum vptr mutatója úgy inicializálódik,hogy a virtuális típus V táblázatán át az osztály virtuális típusú metódusaira fog mutatni."


A bázisosztályban példányosított objektum? Ennek semmi értelme. Ha létrehozol egy objektumot, annak lesz egy vptr-je, ami a megfelelő helyre, a megfelelő V-táblára fog mutatni. De hogy jön ide a bázisosztály? Ha bázisosztálybeli objektumot hozol létre, akkor oda fog mutatni a vptr, egyébként meg máshova. De az, hogy milyen objektumot hozol létre egy adott kódsorban az MINDIG fordítási időben eldől. MINDIG.


"És amikor már létrejött a virtuális objektum származtatott osztálya is akkor a vptr úgy korrigálódik,hogy a bázisosztály felülírt metódusaira mutasson."


Nem. Hacsak nem úgy írtad meg makró vagy template vagy valami egyéb bűvészkedéssel, akkor nem módosul semmi automatikusan.

Sőt, ahogy nézem durván kevered a fordítási és a futási időt.

Származtatott osztály fordítási időben létezik, "virtuális objektum", bármit is jelentsen ez, pedig futásiban. A vptr pedig soha nem "korrigálódik".

2012. jún. 23. 07:21
Hasznos számodra ez a válasz?
 2/4 A kérdező kommentje:

Akkor most nagyon össze zavarodtam.

Ha így van ahogy írtad akkor nem értem ennek működését.

"Soha nem korrigálódik"

Ha soha nem korrigálódik akkor,hogy lehet az,hogy mindig a felülírt metódusokra fog mutatni?

2012. jún. 23. 17:41
 3/4 A kérdező kommentje:

Mindent értek iostream de ha nem korrigálódik akkor,ez csak egyenlő lesz egy függvényfelülírással.


Ha nem korrigálódik akkor a függvény törzse a már futásidőben is megállapítható típusba fog befordulni.

Ami az eredményezi,hogy X *pX = new D;

Nem a felülírt verzió fog lefutni.


A 24 órás könyv le írja,hogy amikor elkészül az objektum származtatott része is akkor a a vptr úgy korrigálódik,hogy a bázisosztály felülírt metódusaira mutasson.

2012. jún. 23. 17:55
 4/4 A kérdező kommentje:
elírtam fordítási időben is megállapítható típusba fog befordulni.
2012. jún. 23. 17:56

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!