----------- Class A---------------
class A
{
public:
virtual void foo1() { printf("in A::foo1()/n");};
virtual void foo2() { printf("in A::foo2()/n"); }
public:
A():a1('A') {};
int a1;
};
[X+0x0]:0x21420
[X+0x4]:0x41
----------- Class B---------------
A
/
B
class B : public A
{
public:
virtual void foo1() { printf("in B::foo1()/n"); }
virtual void foo2() { printf("in B::foo2()/n"); }
public:
B():b1('B'),b2('B') {};
int b1;
int b2;
};
[X+0x0]:0x215c8
[X+0x4]:0x41
[X+0x8]:0x42
[X+0xc]:0x42
----------- Class B (virtual inheritance)---------------
A
/ (virtual)
B
class B : virtual public A
{
public:
virtual void foo1() { printf("in B::foo1()/n"); }
virtual void foo2() { printf("in B::foo2()/n"); }
public:
B():b1('B'),b2('B') {};
int b1;
int b2;
};
[X+0x0]:0x21640 #virtual table of class B
[X+0x4]:0x42
[X+0x8]:0x42
[X+0xc]:0x21640+0x10 #virtual table of class A
[X+0x10]:0x41
----------- Class D --------------
A
/ /
B C
/ /
D
class B : public A
{
public:
virtual void foo1() { printf("in B::foo1()/n"); }
virtual void foo2() { printf("in B::foo2()/n"); }
public:
B():b1('B'),b2('B') {};
int b1;
int b2;
};
class C : public A
{
public:
virtual void foo1() { printf("in C::foo1()/n"); }
virtual void foo2() { printf("in C::foo2()/n"); }
public:
C():c1('C'),c2('C'),c3('C') {};
int c1;
int c2;
int c3;
};
class D : public B, public C
{
public:
virtual void foo1() { printf("in D::foo1()/n"); }
virtual void foo2() { printf("in D::foo2()/n"); }
public:
D():d1('D'),d2('D'),d3('D'),d4('D') {};
int d1;
int d2;
int d3;
int d4;
};
[X+0x0]:0x219d8
[X+0x4]:0x41
[X+0x8]:0x42
[X+0xc]:0x42
[X+0x10]:0x219d8+0x10
[X+0x14]:0x41
[X+0x18]:0x43
[X+0x1c]:0x43
[X+0x20]:0x43
[X+0x24]:0x44
[X+0x28]:0x44
[X+0x2c]:0x44
[X+0x30]:0x44
----------- Class D (virtual inheritance)---------------
A
/ / (virtual)
B C
/ /
D
class B : virtual public A
{
public:
virtual void foo1() { printf("in B::foo1()/n"); }
virtual void foo2() { printf("in B::foo2()/n"); }
public:
B():b1('B'),b2('B') {};
int b1;
int b2;
};
class C : virtual public A
{
public:
virtual void foo1() { printf("in C::foo1()/n"); }
virtual void foo2() { printf("in C::foo2()/n"); }
public:
C():c1('C'),c2('C'),c3('C') {};
int c1;
int c2;
int c3;
};
[X+0x0]:0x21b20
[X+0x4]:0x42
[X+0x8]:0x42
[X+0xc]:0x21b20+0x18
[X+0x10]:0x43
[X+0x14]:0x43
[X+0x18]:0x43
[X+0x1c]:0x44
[X+0x20]:0x44
[X+0x24]:0x44
[X+0x28]:0x44
[X+0x2c]:0x21b20+0x28
[X+0x30]:0x41
---------------------------------------------------------------------------------------------------------
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo1() { printf("in A::foo1()/n"); };
virtual void foo2() { printf("in A::foo2()/n"); }
public:
A():a1('A') {};
int a1;
};
//class B : virtual public A
class B : public A
{
public:
virtual void foo1() { printf("in B::foo1()/n"); }
virtual void foo2() { printf("in B::foo2()/n"); }
public:
B():b1('B'),b2('B') {};
int b1;
int b2;
};
//class C : virtual public A
class C : public A
{
public:
virtual void foo1() { printf("in C::foo1()/n"); }
virtual void foo2() { printf("in C::foo2()/n"); }
public:
C():c1('C'),c2('C'),c3('C') {};
int c1;
int c2;
int c3;
};
class D : public B, public C
{
public:
virtual void foo1() { printf("in D::foo1()/n"); }
virtual void foo2() { printf("in D::foo2()/n"); }
public:
D():d1('D'),d2('D'),d3('D'),d4('D') {};
int d1;
int d2;
int d3;
int d4;
};
int main()
{
#define X D
X d;
int * p = (int *)&d;
int size = sizeof (X)/4;
for (int i=0;i<size;i++)
if ((*(p+i)) > (*p))
printf("[X+0x%x]:0x%x+0x%x/n", i*4,(*p), (*(p+i)) - (*p));
else
printf("[X+0x%x]:0x%x/n", i*4,(*(p+i)));
}
本文探讨了C++中多重继承和虚继承的概念及其内存布局。通过具体示例,展示了不同继承方式下对象的内存组织形式及虚函数表的作用。
255

被折叠的 条评论
为什么被折叠?



