c++之菱形继承问题
昨天面试问了菱形继承的问题,回答的稀巴烂,回来赶快好好学习一波!!!!!
菱形继承如下图:

上一段代码:
#include<bits/stdc++.h>
using namespace std; class Base{
public:
void fun(){
cout<<"Base()"<<endl;
}
}; class A:public Base{ }; class C:public Base{ }; class D:public A,public C{ }; int main(){
D d;
//d.fun(); 出错,返回request for member 'fun' is ambiguous
d.A::fun();
d.C::fun();
return ;
}
可以看到,如果不利用域限定需要访问的函数,那么就会出现模糊调用的问题,但是貌似C++给了更好的方法,虚继承!
#include<bits/stdc++.h>
using namespace std; class Base{
public:
int _base=;
void fun(){
cout<<"Base()"<<endl;
}
}; class A:virtual public Base{
public:
int _base=;
}; class C:virtual public Base{
public:
int _base=;
}; class D:public A,public C{ }; int main(){
D d;
d.fun();//Base()
d.A::fun();//Base()
d.C::fun();//Base()
cout<<d.Base::_base<<endl;//
cout<<d.A::_base<<endl;//
cout<<d.C::_base<<endl;//
return ;
}
利用虚继承就可以解决菱形继承的问题,具体实现是:A和C中不再保存Base的具体内容,而是保存了一份偏移地址,所以在D调用fun()时,调用的就是Base的fun(),但对于A、C相同的变量名,D在调用时还是要利用域限定来处理。虚继承不同于虚函数,虚函数在C++中主要用于实现多态,具体见:虚函数、动态绑定和静态绑定。
c++之菱形继承问题的更多相关文章
- inheritance,菱形继承, 虚继承,virtual
//菱形继承 ||||||| 虚继承 #include <iostream> using namespace std; class R { int r; public: ...
- C++中的类继承(4)继承种类之单继承&多继承&菱形继承
单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...
- C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.
C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式. 目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形 ...
- python 菱形继承问题究极版
如果只是正常的菱形继承,经典类(python2中最后一个父类不继承object类)是深度优先,即会从左边父类开始一路走到底 新式类(最后一个父类继承了object类)是广度优先,即从左边父类开始继承, ...
- C++反汇编-菱形继承
学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记.马上就要出差了,回来后接着写吧. 一.概述 菱形继承是最复杂的对象结构,菱形结构会将单一继承与多重继承进行组合. ...
- C++中的类继承之单继承&多继承&菱形继承
C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或 ...
- C++学习之路(九):从菱形继承引入的对象模型
一.单继承 class A {int a;}; class B : public A {int b;}; 普通的单继承关系,类的大小是由其虚表指针和非静态成员函数大小决定.故上述sizeof(A)的大 ...
- Python面向对象(组合、菱形继承、多态)
今日内容: 1.组合 2.菱形继承 3.多态与多态性 昨天内容重点回顾: 1)调用也叫实例化:发生了2件事 1.创造空对象 2.触发对象下的__init__方法,然后将p连同参数一同传给init ...
- c++继承汇总(单继承、多继承、虚继承、菱形继承)
多重继承中,一个基类可以在派生层次中出现多次,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多分同名成员.C++提供虚基类的方法使得在 ...
随机推荐
- 查阅Springboot官方文档方式----------------Springboot2.0.2最新稳定版
1.登录官方网址: https://spring.io/ 如图所示: 2.选择PROJECTS,就可以看到spring所有的相关项目了. 点开后:其中就包括了Spingboot 3.版本选择,红圈部分 ...
- C#时间操作总结
命名空间:System.Diagnostics Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 Stopwatch 方案中,先调用 Start 方 ...
- js基础学习笔记(二)
2.1 输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出&q ...
- MIT molecular Biology 笔记8 RNA剪接
视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th edition J.D. Wat ...
- hdu 4920
http://acm.hdu.edu.cn/showproblem.php?pid=4920 给定两个n阶矩阵,求矩阵相乘后模3. 直接搞肯定会超时 特殊处理1和2的情况 实际上是水过的..... 貌 ...
- SRM469
250pt 在一个10^9 * 10^9大的剧院里,有最多47个位子有人,然后有一对couple想找一对左右相邻的位子,问有多少种选择方式. 思路: 总共有 n * (m-1)种方案,然后扣掉有人位置 ...
- 服务器重启报错:提示fstab readonly报错!( /etc/fstab 只读无法修改的解决办法)
摘自:http://blog.csdn.net/gray13/article/details/7432866 一.问题描述:服务器重启报错:提示fstab readonly报错! 二.问题原因:挂载的 ...
- HDU 4893 线段树的 点更新 区间求和
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- VS2015中不同开发环境设置转换(C#->C++等)
backup VS2015 社区版(Community)下载地址:迅雷下载:ed2k://|file|cn_visual_studio_community_2015_x86_dvd_6847368.i ...
- 为什么主流的 App 看起来都差不多?这可能是件好事
欢迎访问网易云社区,了解更多网易技术产品运营经验. 现在设计师可以把精力都花在真正有意义的地方了. 打开Instagram.Airbnb.Apple Music.Twitter.Dropbox或Lyf ...