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;

questionAnswers(4)

yourAnswerToTheQuestion