【转】C++中多重继承的二义性及解决办法
转自:http://www.cnblogs.com/lintong/archive/2012/07/28/2613002.html
1. 什么是多重继承的二义性
class A{
public:
void f();
}
class B{
public:
void f();
void g();
}
class C:public A,public B{
public:
void g();
void h();
};
如果声明:C c1,则c1.f();具有二义性,而c1.g();无二义性(同名覆盖)。
2. 解决办法一 -- 类名限定
调用时指名调用的是哪个类的函数,如
c1.A::f();
c1.B::f();
3. 解决办法二 -- 同名覆盖
在C中声明一个同名函数,该函数根据需要内部调用A的f或者是B的f。如
class C:public A,public B{
public:
void g();
void h();
void f(){
A::f();
}
};
4. 解决办法三 -- 虚基类(用于有共同基类的场合)
virtual 修饰说明基类,如:
class B1:virtual public B
虚基类主要用来解决多继承时,可能对同一基类继承继承多次从而产生的二义性。为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。注意:需要在第一次继承时就要将共同的基类设计为虚基类。虚基类及其派生类构造函数建立对象时所指定的类称为最(远)派生类。
- 虚基类的成员是由派生类的构造函数通过调用虚基类的构造函数进行初始化的。
- 在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。
- 在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其他基类对虚基类的构造函数的调用被忽略。
class B{
public:
int b;
}
class B1:virtual public B{
priavte:
int b1;
}
class B2:virutual public B{
private:
int b2;
}
class C:public B1,public B1{
private:
float d;
}
C obj;
obj.b;//正确的
如果B1和B2不采用虚继续,则编译出错,提示“request for member 'b' is ambiguous”。这是因为,不指名virtual的继承,子类将父类的成员都复制到自己的空间中,所以,C中会有两个b。
#include<iostream>
using namespace std; class B0{
public:
B0(int n) {
nv=n;
cout<<"i am B0,my num is"<<nv<<endl;
}
void fun() {
cout<<"Member of Bo"<<endl;
}
private:
int nv;
}; class B1:virtual public B0{
public:
B1(int x,int y):B0(y){
nv1=x;
cout<<"i am B1,my num is "<<nv1<<endl;
}
private:
int nv1;
}; class B2:virtual public B0{
public:
B2(int x,int y):B0(y){
nv2=x;
cout<<"i am B2,my num is "<<nv2<<endl;
}
private:
int nv2;
}; class D:public B1,public B2{
public:
D(int x,int y,int z,int k):B0(x),B1(y,y),B2(z,y){
nvd=k;
cout<<"i am D,my num is "<<nvd<<endl;
}
private:
int nvd;
}; int main(){
D d(1,2,3,4);
d.fun();
return 0;
}
d.fun()的结果是:
i am B0,my num is 1
i am B1,my num is 2
i am B2,my num is 3
i am D,my num is 4
Member of Bo
【转】C++中多重继承的二义性及解决办法的更多相关文章
- c++,多继承造成的二义性及解决办法
#include <iostream> using namespace std; //------------------------------- class A1{ public: i ...
- iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)
问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Font ...
- 虚拟机中不能连接usb设备解决办法
虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...
- Aasible中cryptography兼容性报错解决办法
Aasible中cryptography兼容性报错解决办法 1 Ansible中使用ansible --version查看版本,报错信息如下: ERROR! Unexpected Exception, ...
- windows10中git-bash闪退的解决办法
windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...
- SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法
.NET 中 SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法: 一. 1.将项目逐个进行编译, ...
- RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法
如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...
- iOS cocopods安装使用和安装过程中遇到的问题及解决办法
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
随机推荐
- 日均百万 PV 的站点如何做性能监测?试试「3M口罩」!
对很多开发者而言,如果网站的日流量达到百万级别,峰值 PV 也突破了 3 万,这样的站点在线下测试的时候总是让人心力交瘁.... 生产环境下的性能监测问题更是尤其让人头疼! 开发同学在想,运维人员也在 ...
- 汇编函数调用中bp和sp是指什么?
bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址sp是栈顶指针,它每次指向栈顶.每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值.像下面这样:在函数进 ...
- ASP.NET MVC 入门3、Routing
本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和& ...
- leetcode面试准备:Kth Largest Element in an Array
leetcode面试准备:Kth Largest Element in an Array 1 题目 Find the kth largest element in an unsorted array. ...
- Android开发UI之常用控件的使用
1.日期选择控件 DatePickerDialog 代码: btnChooseDate=(Button) findViewById(R.id.btnChooseDate); btnChooseDate ...
- 实验一DOS报告
实验一.DOS命令解释程序的编写实验 13物联网 李名贵 201306104123 一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: (3)掌握简单的DOS调用方法 ...
- hdu4649Professor Tian
http://acm.hdu.edu.cn/showproblem.php?pid=4649 枚举当前状态是0或者是1的概率 其实就枚举1的概率 最后概率乘这个数 位运算用得不熟 老出错 #incl ...
- addChildViewController 与 addSubview
在viewcontrollerA中, 如果想把controllerB.view添加进来, 可以用 addSubview, 但如果controllerB中有个事件, 使用到 self.navigatio ...
- 为SharePoint网站创建自定义导航菜单
转:http://kaneboy.blog.51cto.com/1308893/397779 相信不少人都希望把SharePoint网站内置的那个顶部导航菜单,换成自己希望的样式.由于SharePoi ...
- 数学物理学报Offprints and Remuneration