class B class C
^ ^
/ /
/ /
/ /
class D
p=24500,*p=217f8
p=24504,*p=b
p=24508,*p=21804
p=2450c,*p=c
p=24510,*p=d
class A
^
/ /
/ /
/ /
class B class C
^ ^
/ /
/ /
/ /
class D
p=41390,*p=21a88
p=41394,*p=a
p=41398,*p=1
p=4139c,*p=b
p=413a0,*p=21a94
p=413a4,*p=a
p=413a8,*p=1
p=413ac,*p=c
p=413b0,*p=d
-- appendix: definition of class A, class B, class C
class A {
public:
A():a(0xa),i(0x1) {}
virtual ~A() {};
public:
int a;
int i;
};
class B :public A {
public:
B():b(0xb) {}
virtual ~B() {}
public:
int b;
};
class C :public A {
public:
C():c(0xc) {}
virtual ~C() {}
public:
int c;
};
class D : public B, public C {
public:
D():d(0xd) {}
virtual ~D() {}
public:
int d;
};
int main(int argc, char *argv[])
{
D *d = (D *)new D();
int *p = (int *)d;
for(int i=0;i<sizeof(D)/4;i++)
{
printf("p=%x,*p=%x/n",(p+i),*(p+i));
}
printf("/n");
// printf("i=%d/n",d->i); // !!! Here d->i cannot be accessed, because "For A::i, the base class A is ambiguous in D.",
// this is why virtual inherit is introduced.
return EXIT_SUCCESS;
}