c++之菱形继承

前天和大学室友吃烧烤,其中谈到菱形继承的问题,突然发现脑中对这个几乎空白,所以晚上回来就上网搜了搜,言归正传,说到菱形继承,就要说到虚继承的概念,对于虚继承,就是为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
class 派生类名:virtual 继承方式  基类名
virtual是关键字,声明该基类为派生类的虚基类。
在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。
声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。

 

菱形继承的结构如下:
                        A 
                    ------ 
                      /     \ 
              -----     ------ 
                  B             C   
              -----     ------ 
                    \         / 
                    ------ 
                        D 
                    ------

转化为代码形式 

class A{}; //基类

class B:public A{};//子类

class C:public A{};

class D:public B,public C();

如上代码中A,B,C,D就构成了一个菱形继承,如果不用虚基类来实现菱形继承就会导致模糊调用的现象,所谓模糊调用就是说在D的内存中会保留两个基类A的对象,如何解决这个问题,利用虚基类就能很好的解决这个问题,即可改为

class B:virtual public A{};//子类

 

class C:virtual public A{};

这就是c++臭名昭著的菱形继承现象,而java则没有

 

转载于:https://www.cnblogs.com/chllovegeyuting/archive/2012/08/07/2627450.html

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

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

相关文章

LeetCode 1506. Find Root of N-Ary Tree(异或)

文章目录1. 题目2. 解题1. 题目 Given all the nodes of an N-ary tree as an array Node[] tree where each node has a unique value. Find and return the root of the N-ary tree. Follow up: Could you solve this problem in constant space complexity with a linea…

客户端与服务器之间的文件传输,客户端与服务器的文件传输

客户端与服务器的文件传输 内容精选换一换使用FTP上传文件时,写入失败,文件传输失败。该文档适用于Windows系统上的FTP服务。FTP服务端在NAT环境下,客户端需使用被动模式连接服务端。在这种情况下,服务端的IP地址无法从路由器外部…

LeetCode 280. 摆动排序

文章目录1. 题目2. 解题1. 题目 给你一个无序的数组 nums, 将该数字 原地 重排后使得 nums[0] < nums[1] > nums[2] < nums[3]...。 示例: 输入: nums [3,5,2,1,6,4] 输出: 一个可能的解答是 [3,5,1,6,2,4]来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链…

复制文本框内容至剪贴板

1 <body> 2 <form id"form1" runat"server"> 3 <div> 4 <textarea id"txtArea" cols"30" rows"3">我是一个文本&#xff0c;Hello World&#xff01;</textarea><br />…

js动态添加控件服务器响应,JS实现动态给标签控件添加事件的方法示例

本文实例讲述了JS实现动态给标签控件添加事件的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">function set() {var obj document.getElementById("fy");//obj.attach…

LeetCode 683. K 个空花盆(set/滑动窗口)

文章目录1. 题目2. 解题2.1 set 有序2.2 滑动窗口1. 题目 花园里有 N 个花盆&#xff0c;每个花盆里都有一朵花。 这 N 朵花会在 N 天内依次开放&#xff0c;每天有且仅有一朵花会开放并且会一直盛开下去。 给定一个数组 flowers 包含从 1 到 N 的数字&#xff0c;每个数字表…

(转)一步一步Asp.Net MVC系列_权限管理设计起始篇

原文地址&#xff1a;http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html前一段时间,写了一步一步asp.net的一系列博客,最近,也快要大四,忙着准备找个工作,这也算是最后一个假期了,这个系列可能不太长,尽量写完.还是多学习,少扯淡的风格,我们的学习还好继续,现在…

无盘服务器 机械盘,Win7启动速度研究,同样的PC配置,机械盘、固态盘、无盘网络启动速度为何不同?...

别装深沉了&#xff0c;赶快来凑凑热闹吧&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册x一、环境&#xff1a;一台台式机(映泰B85、i5-4590、16G内存、三星、Intel固态盘、Realtek网卡)&#xff1b;一台笔记本(T440P、8G内存、三星、Inte…

LeetCode 681. 最近时刻

文章目录1. 题目2. 解题1. 题目 给定一个形如 “HH:MM” 表示的时刻&#xff0c;利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。 你可以认为给定的字符串一定是合法的。 例如&#xff0c;“01:34” 和 “12:09” 是合法的&#xf…

指针和对象

使用对象指针时&#xff0c;需要注意几点&#xff1a; 使用常规表示法来声明指向对象的指针&#xff1a; String *glamour&#xff1b; 可以将指针初始化为指向已有的对像&#xff1a; String *first&saying[0]&#xff1b; 可以使用new来初始化指针&#xff1a; String…

最右显示请求服务器不存在,修改合流任务_实时音视频 RTC_服务端API参考_合流任务管理_华为云...

响应示例状态码&#xff1a; 200修改成功{"jobs" : [ {"job_id" : "607824b4fa163e19fe301cc817dda855","job_unique_id" : "707e5bfb1ccf4eef","stream_name" : "m_607824b4fa163e19fe301cc817dda855_gigu&…

[Hands On ML] 5. 支持向量机

文章目录1. 线性支持向量机分类2. 非线性支持向量机分类2.1 多项式核2.2 高斯 RBF 核3. 支持向量机回归4. 原理本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 SVM 特别适合应用于复杂但中小规模数据集的分类问题。 可参考&#…

网络流sap需要注意的地方

int sap(){memset(level, 0, sizeof level);memset(gap, 0, sizeof gap);memset(cur, 0, sizeof cur);int u pre[s] s;int aug inf;gap[s] n;这个要使源点gap值为点个数int v;int flow 0;while(level[s] < n){for(v cur[u]; v < n; v ){if(c[u][v] > 0 &&am…

LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s &#xff0c;找出 至多 包含 k 个不同字符的最长子串 T。 示例 1: 输入: s "eceba", k 2 输出: 3 解释: 则 T 为 "ece"&#xff0c;所以长度为 3。示例 2: 输入: s "aa", k 1 输出: 2 解释…

麦森数(转)

1 //形如2n-1的素数称为麦森数&#xff0c;这时n一定也是个素数。但反过来不一定&#xff0c;即如果n是个素数。2n-1不一定也是素数。2 3 #include<iostream>4 #include<cmath>5 #include<cstdio>6 #include<cstring>7 #define N 1268 using name…

LeetCode 616. 给字符串添加加粗标签(Trie树)

文章目录1. 题目2. 解题1. 题目 给一个字符串 s 和一个字符串列表 dict &#xff0c;你需要将在字符串列表中出现过的 s 的子串添加加粗闭合标签 <b> 和 </b> 。 如果两个子串有重叠部分&#xff0c;你需要把它们一起用一个闭合标签包围起来。 同理&#xff0c;如…

var与dynamic区别

注意&#xff1a;var与dynamic这两个关键字&#xff0c;只是看起来很相 似&#xff0c;仅此而已&#xff01; var表示“变量的类型是在编译时决定的”&#xff0c;但是dynamic表 示“变量的类型是在运行时决定的”。因此&#xff0c;dynamic与var具有截然不同的含义。 var让 …

LeetCode 158. 用 Read4 读取 N 个字符 II

文章目录1. 题目2. 解题1. 题目 给你一个文件&#xff0c;并且该文件只能通过给定的 read4 方法来读取&#xff0c;请实现一个方法使其能够读取 n 个字符。 注意&#xff1a;你的 read 方法可能会被调用多次。 read4 的定义&#xff1a; 参数类型: char[] buf返回类型: int …

小白学数据分析-----数据指标 累计用户数的使用

小白学数据分析--数据指标累计用户数的使用 累计用户数是指注册用户数的累计&#xff0c;即可以认为是新用户的累计。在一般的数据统计中&#xff0c;我们基本上都会涉及到这个指标&#xff0c;且这个指标是逐渐累加的&#xff0c;比如&#xff1a; 时间 注册…

LeetCode 751. IP 到 CIDR(贪心)

文章目录1. 题目2. 解题1. 题目 给定一个起始 IP 地址 ip 和一个我们需要包含的 IP 的数量 n&#xff0c;返回用列表&#xff08;最小可能的长度&#xff09;表示的 CIDR块的范围。 CIDR 块是包含 IP 的字符串&#xff0c;后接斜杠和固定长度。例如&#xff1a;“123.45.67.8…