热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20210921c++继承,虚继承(内存结构)

原标题:2021-09-21c++继承,虚继承(内存结构)普通的公有继承

原标题:2021-09-21c++ 继承,虚继承(内存结构)

普通的公有继承

class test1
{
public:
test1(int i) :num1(i) {}
private:
int num1;
};
class test2 : pwww.yii666.comublic test1
{
public:
test2(int i,int j) : test1(i), num2(j)
{

}
private:
int num2;
};
void main()
{
test2 t2(1,2);
}

(test2内存结构)查看内存发现父类在子类的上面

多重继承

在原有的代码基础上增加了test3类

test3类继承了test2和test1

class test1
{
public:
test1(int i) :num1(i) {}
private:
int num1;
};
class test2
{
public:
test2(int i) : num2(i)
{

}
private:
int num2;
};
class test3 :public test2 ,public test1
{
public:
test3(int i, int j,int k) :test1(i), test2(j),num3(k) {}
private:
int num3;
};
void main()
{
test3 t3(1, 2, 3);
}

(test3内存地址 ) 依旧是父类在子类上

但是现在有两个父类为什么test2在test1上?

这和我们的继承顺序有关 我们先继承了test2又继承了test1 更换内存继承顺序 内存的情况也会有所变化

虚继承

class test1
{
public:
test1(int i) :num1(i) {}
private:
int num1;
};
class test2: virtual public test1
{
public:
test2(int iwww.yii666.com,int j) :test1(i), num2(j)
{

}
private:
int num2;
};
void main()
{
test2 t2(1, 2);
}

(t2的内存) 我们发现虚继承以后父类成员数据在子类成员数据下面了 首地址处莫名其妙多了四字节

这四字文章来源地址51281.html节就是我们的虚基类表的地址

跟随虚继承表 其中存储了本类距离父类对象的差值 通过差值文章来源站点https://www.yii666.com/能够找到父类对象

我们再看这个内存0x0082fbd8是t2的首地址 0x0082fbe0是父类的位置

0x0082fbd8 -0x0082fbe0 == 8

就是本类距离父类对象的差值

虚继承(菱形继承)

class test1
{
public:
test1(int i) :num1(i) {}
private:
int num1;
};
class test2: virtual public test1
{
public:
test2(int i,int j) :test1(i), num2(j)
{
}
private:
int num2;
};
class test3 :virtual public test1
{
public:
test3(int i, int j) :test1(i), num3(j){}
private:
i文章来源地址51281.htmlnt num3;
};
class test4 :public test2, public test3
{
public:
test4(int i, int j, int k) :test1(i),test2(i,j), test3(i,j),num4(k)
{
}
private:
int num4;
};
void main()
{
test4 t4(1, 2,3);
}

test4的内存 我们看到 t2和t3都有自己的虚基类表地址 记录了自己和父类的偏移

两个虚基类表的内容

现在我们计算一下 到爷爷类的差值是否正确

0x00FAFD50 - 0x00fafd3c == 14

0x00FAFD50 -0x00fafd44== C

来源于:2021-09-21c++ 继承,虚继承(内存结构)


推荐阅读
  • Java课程设计/大作业合集
    原标题:Java课程设计/大作业合集目录前言一、需求描述二、功能介绍三、具体实现 ... [详细]
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 原标题:python从list中随机取值原创第一种方法(推荐)适用于随机取一个值, ... [详细]
  • php从哪里得到框架(2023年最新分享)
    导读:本篇文章编程笔记来给大家介绍有关php从哪里得到框架的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、如何用PHP制 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 利用Docker部署JupyterHub以支持Python协同开发
    本文介绍了如何通过Docker容器化技术安装和配置JupyterHub,以实现多用户的Python开发环境,特别适合团队协作场景。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 原标题:vue+element_ui上传文件,并传递额外参数需求:文件大小验证文件类型验证额外参 ... [详细]
author-avatar
V体验_数码IT
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有