Czy ktos moze wie dlaczego ponizszy program nieprawidlowo pokazuje
adres metody
Inc() pobranej z vtable.
Bardzo dziekuje za pomoc.
#include <iostream>
using namespace std;
class Human
{
public:
virtual void Set ( void )
{
}
virtual void Inc ( void )
{
uintptr_t *t = reinterpret_cast <uintptr_t*> (this);
uintptr_t *vptr = reinterpret_cast <uintptr_t*> (*t);
uintptr_t *set = reinterpret_cast <uintptr_t*> (*vptr);
uintptr_t *inc = reinterpret_cast <uintptr_t*> (*(vptr+4));
cout << hex << t << endl;
cout << hex << vptr << endl;
cout << hex << set << endl;
cout << hex << inc << endl; // !!! ZLY ADRES !!! :(
}
};
void Action ( Human &human )
{
human . Set ();
human . Inc ();
}
int main ( void )
{
Human human;
Action ( human );
return 0;
}
Podpowiedź. O jaką wartość zostanie przesunięty wskaźnik vptr?
Na pewno nie o 4 bajty.
BTW. po co Ci to? Skąd wiesz jak kompilator implementuje metody
wirtualne? Standard nic nie mówi na ten temat. To jest zależne
od implementacji kompilatora.
Pozdrawiam
KK
Nie pamiętam już gdzie, ale chyba pamiętam po co, zrealizowano
metody wirtualne w postaci globalnej tablicy adresów, a wewnątrz
składowych klasy zamieszczono indeksy do owej globalnej tablicy.
A po co? Po to aby zaoszczędzić na pamięci, można obliczyć
co do jednego bitu ile potrzeba pamięci na każdy indeks, natomiast
adres metody wirtualnej to zawsze kilka bajtów.
Apropo, przez takie sztuczki jeden z moch starych programów
nie działa po skompilowaniu VC7 lub nowszym :)
Pozdrawiam
tablicy?