类对象内存布局,虚函数,虚拟继承和多重继承的实现

本文深入探讨C++中类对象的内存布局,包括无继承关系的类、单一继承(单层与多层)、多重继承的实现机制。涉及虚函数、虚拟继承的影响,以及不同继承方式下的内存分布和虚表处理。
摘要由CSDN通过智能技术生成

类对象内存布局,虚函数,虚拟继承和多重继承的实现机制

1.      无继承关系的类

2.      单一继承

2.1单层继承

2.2多重继承

3.      多重继承


一.无继承关系的类

已知A类与B类,A类代表无虚函数的类,B类代表有虚函数的类,下文都用字母表示上文多提到的类类型。

classA{
public:
              int a_1;
              int a_2;
 
              A(int v1 = 1, int v2 =2)
                             :a_1(v1),a_2(v2){}
 
              void show(){
                             cout<< "class A" << endl;
              }
};
 
classB{
public:
              int b_1;
              int b_2;
 
              B(int v1 = 1, int v2 =2)
                             :b_1(v1),b_2(v2){}
 
              void virtual show(){
                             cout<< "class B" << endl;
              }
};
做如下测试:
{
//无继承关系类对象的大小
              cout<<"baseclass objects size:"<<endl;
              cout<<"sizeof(A)="<<sizeof(A)<<endl;
              cout<<"sizeof(B)="<<sizeof(B)<<endl<<endl;
              //无继承关系类对象的数据成员在内存中的读取
              Aa(1,2);
              Bb(1,2);
 
              int *pa = (int*)&a;
              cout<< "data member address and its value inclass A object" << endl;
              cout<<pa << "               " << pa[0] << endl;
              cout<<pa + 1 << "           " << pa[1] <<endl;
 
              int *pb = (int*)&b;
              cout<< "data member address and its value inclass B object" << endl;
              cout<<pb << "               " << pb[0] << endl;
              cout<<pb + 1 << "           " << pb[1] <<endl;
              cout<<pb + 1 << "           " << pb[2] <<endl;
}

结果如下:


很明显,A类对象的内存布局如下:

int a_1

int a_2

而在B中首先放的是指向虚函数表(简称vptr)的指针,本例中虚函数表的存放地址为0x4290756,B类对象的内存布局如下:

vptr_B

int b_1

int b_2

二.单一继承

1.单层继承

1)派生于A类的子类:

                  ClassC:内不增虚函数,普通继承

                  ClassD:内设虚函数,普通继承

                  ClassG:内不增虚函数,虚拟继承

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值