3 Třídy, VMT a RTTI
- poznat rozložení objektu a volání přes VMT
- najít konstruktor podle přiřazení VMT
- číst hierarchii tříd z RTTI
3.1 Ukázka: virtuální volání
mov eax, [ebp+8] ; this
mov edx, [eax] ; VMT je první pole objektu
mov eax, [ebp+8]
push eax
call dword ptr [edx+8] ; třetí metoda
Dvojitá dereference a volání přes offset je podpis virtuálního volání. Offset 8 je třetí položka VMT.
3.2 Objekty
Struktura leží v paměti se zarovnáním a vycpávkou. Dědičnost skládá potomka za předka. Polymorfní třída má jako první skrytý ukazatel pVMT.
Tabulka ukazatelů na virtuální metody třídy. Konstruktor ji přiřadí do this->pVMT.
Jak najít konstruktor: hledej odkazy na VMT. Funkce, která ji zapisuje na [this], je konstruktor nebo destruktor. U předků se přiřazení opakuje, protože se volají konstruktory po řadě, a u optimalizovaného kódu mohou být inlinované.
3.3 RTTI
Před VMT, na vfptr[-1], leží ukazatel na _RTTICompleteObjectLocator. Z něj vede cesta na popis typu se jménem a na hierarchii tříd. dynamic_cast a typeid z těchto dat žijí.
Když RTTI existuje, dá ti názvy tříd a jejich předky. Bez ní zbývá dedukce z konstruktorů.
U úlohy 3 nestačí výpis nástroje. Musíš interpretovat, co vidíš, a argumentovat, proč hierarchie platí a jiná ne.
3.4 Kvíz
3.5 Tahák
mov edx, [eax]+call [edx+n]= virtuální volání, index n / 4.- Konstruktor zapisuje VMT na
[this]. vfptr[-1]→ RTTI → jména a hierarchie.- Interpretuj, nekopíruj výpis nástroje.