Meghatároztam egy származtatott osztály egy var tagját az alaposztály egy var tagjára való hivatkozásként. Ezt azért teszem, mert a származtatott osztályban a hivatkozás neve értelmesebb, mint az eredeti változó neve az alaposztályban.
Most létrehozok egy char puffert, amely elég nagy ahhoz, hogy tartalmazza a származtatott osztály objektumát. Meghatározok egy mutatót a származtatott osztályra, és egy static_cast
használatával a pufferre mutatom.
Ha a származtatott osztály egy tagfüggvénye a var alaposztály tagra hivatkozik az alaposztályban meghatározott eredeti nevén, akkor nincs probléma.
De ha a hivatkozás nevével megszüntetik a hivatkozást, memória-hozzáférési szabálysértést kapok.
- Miért az eltérő viselkedés?
Hogyan érhetem el azt, amit próbálok, vagyis hogy a származtatott osztályban más néven hivatkozzam a változóra?
class B { public: int x; B () : x(10) {} }; class D : public B { public: int &y{ x }; // No problem here: inline bool IsXTen () { return ((x == 10) ? true : false); } // Memory Access Violation occurs here: inline bool IsYTen () { return ((y == 10) ? true : false); } }; int main(int argc, char* argv[]) { char buf[sizeof (class D)] = { 0 }; void *pVoid = buf; class D *pd = static_cast<class D*>(pVoid); if (pd->IsXTen ()) { return 1; } if (pd->IsYTen ()) { return 2; } return 0; }