C++类内虚函数、虚继承内存分布(代码+分布结果展示)仔细坚持看完,必有收获!

本文详细介绍了C++中类的内存分布,特别是涉及到虚函数和虚继承的情况。通过Visual Studio工具展示了类内存布局、虚表和虚指针的工作原理,解释了如何利用虚表和虚指针实现多态。文章还探讨了多重继承和虚继承的内存组织,以及它们对虚表指针的影响。
摘要由CSDN通过智能技术生成

书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。
我们先用好Visual Studio工具,像下面这样一步一步来:
在这里插入图片描述
在这里插入图片描述
先选择左侧的C/C+±>命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。
下面可以定义一个类,像下面这样:

class Base
{
   
    int a;
    int b;
public:
    void CommonFunction();
};

然后编译一下,可以看到输出框里面有这样的排布:
在这里插入图片描述
这里不想花精力在内存对齐因素上,所以成员变量都设为int型。
从这里可以看到普通类的排布方式,成员变量依据声明的顺序进行排列(类内偏移为0开始),成员函数不占内存空间。

再看下继承,往后面添加如下代码:

class DerivedClass: public Base
{
   
    int c;
public:
    void DerivedCommonFunction();
};

编译,然后看到如下的内存分布(父类的内存分布不变,这里只讨论子类成员变量的内存分布):
在这里插入图片描述
可以看到子类继承了父类的成员变量,在内存排布上,先是排布了父类的成员变量,接着排布子类的成员变量,同样,成员函数不占字节。
下面给基类加上虚函数,暂时注释掉DerivedClass,看一下这时的内存排布:

class Base
{
   
    int a;
    int b;
public:
    void CommonFunction();
    void virtual VirtualFunction();
};

在这里插入图片描述

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值