C++继承-补充

本期对继承的知识进行一些补充,还没看过之前对继承讲解的建议先看之前的

C++继承_KLZUQ的博客-CSDN博客

本期补充知识为菱形继承以及菱形虚拟继承相关知识

class A 
{
public:virtual void func1(){cout << "A::func1" << endl;}
public:int _a; 
};
class B : public A
//class B : virtual public A
{
public:int _b;
};
class C : public A
//class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};

 

我们进入调试,然后看内存窗口,&d,一上来就可以看到两个指针 ,这里就是虚表的指针

当我们走完时,可以看到里面1,2,3,4,5的变化 

也就是说,我们单纯的看菱形继承,其实是和多继承没有区别的

 下面我们再看看菱形虚拟继承

菱形虚拟继承又分为几个问题,首先是只有A里面有虚函数 ,此时是将A单独拿出来了,放在了下面,这里我们说过了

 而它不同的地方在于,我们上面给A写了func1函数,如果我们对他进行重写

我们会发现,首先编译会报错 ,不重写还没事,B和C重写后就有问题了,这是为什么?

原因是,这里A是属于B和C共享的,B去重写,C也去重写,那到底是谁去重写?

我们先把重写的func去掉,然后此时只有A里面有func1, 只有一张虚表,只有A有虚函数,B也要重写,C也要重写,就不行了

解决方案是让D也去重写 ,此时B,C,D都进行了重写

此时就会有人问,那B和C为什么还要去重写?直接让D重写不就好了吗?其实我们在实际中不仅仅会定义D对象,B和C对象也是可能定义的

对于菱形继承,D里面的B和C各自有各自的A,所以重写没有问题,但是菱形虚拟继承,这个A变成公共的了,B也要用,C也要用,那就都别用了,让D用吧

菱形虚拟继承还有更复杂的问题

B和C增加一些新的虚函数,这些虚函数不是重写A的,那该怎么办?

此时B和C就会各自再建一张虚表 

画出来就是这样,如果我们再开几个内存窗口验证的话,比如我们验证B,我们看地址00329d4c和00329d60,就可以发现一个是虚表,存的虚函数地址,另一个是虚机表,存的偏移量

我们再给D单独加一个func3,大家猜一猜会不会再建立一个虚表?

答案是不会,它直接放在A的虚表里了

以上即为本期全部内容,希望大家可以有所收获

如果错误,还请指正 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/76885.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<指针进阶>指针数组和数组指针傻傻分不清?

✨Blog&#xff1a;&#x1f970;不会敲代码的小张:)&#x1f970; &#x1f251;推荐专栏&#xff1a;C语言&#x1f92a;、Cpp&#x1f636;‍&#x1f32b;️、数据结构初阶&#x1f480; &#x1f4bd;座右铭&#xff1a;“記住&#xff0c;每一天都是一個新的開始&#x1…

数字化赋能高质量施工,成企业创新转型新方向

建筑行业是一个需要投入大量资金、能源消耗大、风险高且劳动力密集的行业&#xff0c;传统施工管理方式存在着“无法实时控制进度、无法实时控制质量、材料浪费、常需返工、安全事件频发”等问题。 为了自身的转型升级&#xff0c;也为了响应国家战略规划落地对建筑行业提出的要…

博客系统之单元测试

对博客系统进行单元测试 1、测试查找已存在的用户 测试名称 selectByUsernameTest01 测试源码 //查找用户&#xff0c;存在 Test public void selectByUsernameTest01 () { UserDao userDao new UserDao(); String ret1 userDao.selectByUsername("张三").toStr…

【仿写tomcat】三、通过socket读取http请求信息

仿写tomcat 建立Socket连接获取连接信息查看HTTP信息 建立Socket连接 这里我们也是创建一个专门管理socket的类 package com.tomcatServer.socket;import java.io.*; import java.net.ServerSocket;/*** 套接字存储** author ez4sterben* date 2023/08/15*/ public class Soc…

Html+JavaScript实现手写签名

前言 Hello各位&#xff0c;本葡萄又来啦&#xff0c;今天遇到的场景是这样的&#xff1a;在日常业务流程中&#xff0c;经常需要某一流程环节中相关责任人员进行审批签字&#xff0c;早期许多公司为了省事就直接会把这位负责人的签名以键盘打字&#xff08;楷体&#xff09;的…

第十五章:联邦学习攻防实战

代码 联邦学习的后门攻击案例 联邦学习的模型压缩案例 联邦学习的差分隐私案例 联邦学习的同态加密案例 联邦学习的参数稀疏化案例

Error creating bean with name ‘esUtils‘ defined in file

报错异常&#xff1a; 背景&#xff1a; esUtils在common服务中、启动media服务时候、报这个异常、后排查esUtils在启动时候发生异常引起的、在相关bean中加入try{}catch{}即可解决问题 String[] split url.split(","); HttpHost[] httpHosts new HttpHost[split.…

LC-平衡二叉树

LC-平衡二叉树 链接&#xff1a;https://leetcode.cn/problems/balanced-binary-tree/description/ 描述&#xff1a;给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的…

如何使用PHP开发网页定时刷新功能

如何使用PHP开发网页定时刷新功能 随着互联网的发展&#xff0c;越来越多的网站需要实时更新显示数据。而实时刷新页面是一种常见的需求&#xff0c;它可以让用户在不刷新整个页面的情况下获得最新的数据。本文将介绍如何使用PHP开发网页定时刷新功能&#xff0c;并提供代码示…

漏洞指北-VulFocus靶场专栏-初级01

漏洞指北-VulFocus靶场专栏-初级 初级001 &#x1f338;海洋CMS代码执行&#xff08;CNVD-2020-22721&#x1f338;step1&#xff1a;进入后台页面 账号密码&#xff1a;admin amdinstep2&#xff1a;点击系统&#xff0c;点击后台IP安全设置,关闭step3 启动burpsuite&#xff…

Docker私有仓库创建

1.Docker私有仓库搭建 拉取私有仓库镜像并启动私有仓库容器。 访问私有仓库容器&#xff0c;表明私有仓库搭建成功。 此时私有仓库就已经搭建完成了。 2.将本机的镜像传到私有仓库 3.将私有仓库镜像拉取到本地

【马蹄集】第二十三周——进位制专题

进位制专题 目录 MT2186 二进制&#xff1f;不同&#xff01;MT2187 excel的烦恼MT2188 单条件和MT2189 三进制计算机1MT2190 三进制计算机2 MT2186 二进制&#xff1f;不同&#xff01; 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目…