次のクラス階層があるとします。
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 ポインタには、D オブジェクトである X のアドレスが含まれています。なぜ?
ここにメモリマップがあります:
&x 0x0036f828 {...} D *
temp1 0x0036f838 {x=5 } A *
temp2 0x0036f830 {y=3 } B *
temp3 0x0036f828 {z=4 } C *