Mikor ön létre a virtuális tábla? C++
És ha már létrejött akkor az miért van hogy csak ebben az esetben hívódik meg az a függvény aminek címe a virtuális táblázatban van?:
F *f = new I ;
Ha a leírt kérdés saját kútfőből fakad, akkor több hibát is látok benne, ami miatt valóban jobban körül kellene írnod, mit is szeretnél kérdezni... Ez így picit elvontnak hangzik.
Ha a kérdés ebben a formában egy tesztkérdés volt, akkor ha komolyan veszem, van rá válasz:
Az I osztály az F-ből származik. Az F osztály absztrakt osztály, azaz tartalmaz pure virtual függvény deklarációt (is). Az I osztály pedig megvalósítja az összes hiányzó virtual függvényt (nem marad pure virtual függvény az I-ben).
Ekkor mivel az F osztály úgynevezett absztrakt osztály, nem lehet példányosítani, mert van benne pure virtual függvény (a fordító hibát ad).
Az I-t viszont lehet, mert minden virtual függvényre van érvényes kód.
Ekkor csak a gyerek osztály függvénye futtatható. Az ősre (absztrakt osztályra) csak pointerrel lehet hivatkozni. Amely végül egy olyan virtual függvényt fog tartalmazni, ami a gyerek típushoz tartozik.
class F{
public:
virtual void myFn()=0;
};
class I: public F{
public:
virtual void myFn(){}
}
Az eredeti fő kérdésre "Mikor jön létre a VMT?" a válasz az, hogy fordítási időben.
Futási időben a new operátor egy I tipusú objektumhoz szükséges memória területet allokál, amelyen belül elérhető az F osztály VMT-je is. Igy az f pointert a fordító tudja F tipusúnak is, és I tipusúnak is értelmezni, ha arra kérjük.
"Futási időben a new operátor egy I tipusú objektumhoz szükséges memória területet allokál, amelyen belül elérhető az F osztály VMT-je is"
Mármint az I VMT-je tartalmazza a nem felüldefiniált metódusok címét is.
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!