C++ Inheritance

本文探讨了C++中多重继承和虚继承的概念及其内存布局。通过具体示例,展示了不同继承方式下对象的内存组织形式及虚函数表的作用。

 

----------- 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)));
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值