给定以下类层次结构:
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 *