Adres wskaźnika C ++ do elementu danych klasy w Visual Studio
Czytam książkęWewnątrz modelu obiektowego C ++. W książce znajduje się przykład:
struct Base1
{
int v1;
};
struct Base2
{
int v2;
};
class Derived : public Base1, public Base2 {};
printf("&Derived::v1 = %p\n", &Derived::v1); // Print 0 in VS2008/VS2012
printf("&Derived::v2 = %p\n", &Derived::v2); // Print 0 in VS2008/VS2012
W poprzednim kodzie zarówno adres Derived :: v1 & Derived :: v2 będzie zarówno0. Jeśli jednak wydrukujesz ten sam adres za pomocą zmiennej:
int Derived::*p;
p = &Derived::v1;
printf("p = %p (&Derived::v1)\n", p); // Print 0 in VS2008/VS2012 as before
p = &Derived::v2;
printf("p = %p (&Derived::v2)\n", p); // Print 4 in VS2008/VS2012
Badając rozmiar & Derived :: v1 i p, otrzymuję 4 w obu.
// Both are 4
printf("Size of (&Derived::v1) is %d\n", sizeof(&Derived::v1));
printf("Size of p is %d\n", sizeof(p));
Adres Derived :: v1 będzie0, ale adres Derived :: v2 będzie4. Nie rozumiem, dlaczego & Derived :: v2 stał się4 kiedy przypisz go do zmiennej.
Sprawdź kod zespołu, gdy bezpośrednio zapytasz o adres Derived :: v2, jest on tłumaczony na a0; ale kiedy przypiszemy go do zmiennej, zostanie ona przetłumaczona na a4.
Przetestowałem go na obu VS2008 i VS2012, wynik jest taki sam. Myślę więc, że musi istnieć jakiś powód, aby Microsoft wybrał taki projekt.
A jeśli to lubisz:
d1.*(&Derived::v2) = 1;
Widocznie& Derived :: v2 nie jest0. Dlaczego kompilator rozróżnia te dwa przypadki?
Czy ktoś może powiedzieć, że coś się dzieje? Dziękuję Ci!
--Edytować--
Dla tych, którzy uważają, że & Derived :: v1 nie ma prawidłowego adresu. Nie zrobiłeś tego nigdy?
Derived d1, d2;
d1.*p = 1;
d2.*p = 1;