A többalakúságnál gyakorlatilag itt mi történik?
Az a többalakúság ha egy származtatott objektumot úgy kezelünk mintha az a bázisosztályból volna igaz ez?
// main.cpp
# include <iostream>
typedef unsigned short ushort ;
using std::cout ;
class X {
public:
virtual ~X(void) {}
virtual void s(void)const { cout << "X" ; }
protected:
private:
};
class Y: public X {
void s(void)const { cout << "Y" ; }
};
class S: public X {
void s(void)const { cout << "S" ; }
};
int main(void) {
X *x = new S ;
x->s() ;
return 0 ;
}
Ebben a kódban egy származtatott típust létrehozok a dinamikus memóriában ugye?És ennek a címét rendelem hozzá az X hez.igaz?
És azért helyes ez mert a származtatott típus egyben bázistípus is.
Virtuális kulcsszót bevezetve készül az osztály számára egy virtuális táblázat ugye?És ez inicializálódni fog minden virtuális függvény címével.Majd amikor létrejön az osztály származtatott része is akkor pedig felülíródik a virtuális táblázatban a bázisosztály virtuális függvényének a címe a származtatott osztályban levő felülírt függvény címével?Jól tudom?
"Virtuális kulcsszót bevezetve készül az osztály számára egy virtuális táblázat ugye?És ez inicializálódni fog minden virtuális függvény címével.Majd amikor létrejön az osztály származtatott része is akkor pedig felülíródik a virtuális táblázatban a bázisosztály virtuális függvényének a címe a származtatott osztályban levő felülírt függvény címével?Jól tudom?"
Itt van egy kis kavarás. Kevered az objektumot az osztállyal. Az elején még azt írod, hogy az OSZTÁLY számára jön létre a vtbl, aztán azt írod, hogy amikor létrejon az OSZTÁLY származtatott része... na most az osztálynak nincs származtatott része, az objektumoknak lehet. És a virtuális tábla OSZTÁLYHOZ kötődik, ahogy az első mondatban írtad is, nem objektumhoz. Az objektumoknak egy mutatója van erre a táblára, és minden osztálynak (és nem objektumnak) van egy saját táblája, az objektumok virtuális tábla mutatója pedig arra a táblára mutat, amelyik az ő valódi osztályához tartozik, nem a látszólagoshoz (látszólagos az, amelyiken keresztül eléred).
Akkor az én példámban az *x objektum az X típusban levő virtuális táblázatra mutat?Jól mondom itt?
És ebben a virtuális táblában levő memóriacímek pedig a származtatott osztályban felülírt függvények memóriacímei vannak?
Itt nem értem,hogy melyik osztályra gondolsz.
"amelyik az ő valódi osztályához tartozik, nem a látszólagoshoz (látszólagos az, amelyiken keresztül eléred)."
X *x = new Y ;
Az X a látszólagos vagy az Y.?Melyikre gondoltál?
Szerintem a bázisosztályra gondoltál hisz csak annak van virtuális táblája.
De lesz a származtatott típusnak is nem?
Mert megkapja az is a bázisosztályét mert örökli belőle.
Hogy van ez az egész egy normális részletes leírás nincs.
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!