考慮下面的類層次結構:虛擬多重繼承和指針
class A {
int x;
public:
A(int X) : x(X) {}
void setX(int x) { this->x = x; }
};
class B : public virtual A {
int y;
public:
B(int X, int Y) : A(X), y(Y) {}
};
class C : public virtual A {
int z;
public:
C(int X, int Z) : A(X), z(Z) {}
};
class D : public C, public B {
public:
D(int x, int y, int z) : A(x), C(x,z), B(x,y) {}
};
和以下主要:
int main (void)
{
D x(2,3,4);
A* temp1 = &x;
B* temp2 = &x;
C* temp3 = &x;
}
似乎temp1中,TEMP2和TEMP3都指向不同的地址.. B和C不應該共享相同的A對象嗎? 畢竟,每個C和B對象也是一個A,所以指針應該首先「看見」A對象。不。 另外,C指針包含X的地址..這是一個D對象。爲什麼?
這裏是存儲器映射:
&x 0x0036f828 {...} D *
temp1 0x0036f838 {x=5 } A *
temp2 0x0036f830 {y=3 } B *
temp3 0x0036f828 {z=4 } C *
hehe感謝那個博客..有點相同的問題。所以我猜C是指向X,因爲D中的第一個對象是C。 – Rouki
@Rouki我發現一個更好的示例/鏈接編輯了包含該鏈接的答案,它更好地解釋了內存佈局,並具有虛擬繼承的功能。是的,這是因爲C是佈局中的第一個基類。 –
非常感謝你;) – Rouki