C++在gcc下的单继承,多继承,虚继承的内存布局

本文探讨了GCC编译器下C++的单继承、多继承和虚继承的内存存储模型,通过实例展示了不同继承方式的内存布局特点。内容包括无重写和重写情况下的存储模型,以及虚继承解决的菱形继承问题,阐述了GCC如何处理虚函数表和虚基类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文目的

 
  最近看了《深入探索c++对象模型》,被其中关于虚函数的各种继承的内存结构,绕来绕去,十分纠结。并且在《深入探索c++对象模型》这本书中的的各种结构是大体的策略,可以用来理解,但是gcc编译器中的具体实现比较详细。而网上gcc下各种继承的存储结构都不是特别地详细。
  本文以gcc下单继承,多重继承,虚拟继承的具体存储模型详细展开。

gcc下不同继承方式的存储模型

  以下是gcc下单继承,多重继承和虚拟继承的存储细节。

  • 测试环境为:Linux 4.15.0 ,gcc 5.4.0,ubuntu16.04。
  • 测试方式通过 g++ -fdump-class-hierarchy xx.cpp 命令生成分析文件并cat
  • 以上命令能够生成cpp文件中类的内存结构,有兴趣的读者可以自己尝试一下

单继承

  我们之前的例子都是单继承,即每一个派生类只继承于一个父类。狗继承动物,猎狗继承狗。

单继承无重写:

如果子类没有重写父类的虚函数
在这里插入图片描述

 class Animal{
   
      public:
          virtual void eat(){
   }
          virtual void run(){
   }
      private:
          int name;
          int age;
 };
 class Dog : public Animal{
   
      public:
          virtual void shout(){
   }
          virtual void stand(){
   }
 };

这里贴一个生成分析文件的内容作为演示,之后各种继承方式,由于过长不再贴出。
在这里插入图片描述
存储模型:
在这里插入图片描述


单继承重写

如果子类重写了父类的eat方法
在这里插入图片描述

 class Animal{
   
      public:
          virtual void eat(){
   }
          virtual void run(){
   }
      private:
          int name;
          int age;
 };
 class Dog  : public Animal{
   
      public
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值