c++,多继承造成的二义性及解决办法
#include <iostream>
using namespace std;
//-------------------------------
class A1{
public:
int a;
public:
void m();
}; void A1::m() {
cout<<"A1::m():a="<<this->a<<endl;
} //-------------------------------
class A2 {
public:
int a;
void m();
}; void A2::m() {
cout<<"A2::m(),a="<<this->a<<endl;
} //-------------------------------
class B :public A1, public A2{
public:
void show();
}; void B::show()
{
cout<<"A1::a="<<this->A1::a<<endl;
cout<<"A2::a="<<this->A2::a<<endl;
} //-------------------------------
void f1() {
B b;
b.A1::a = ;
b.A2::a = ; b.A1::m();//这时不能用b.m(),具有歧义;
b.A2::m();//用格式 b.A1::m(), b.A2::m()明确对象,消除歧义
b.show();
}
int main() {
f1();
while();
return ;
}
/*测试结果:
A1::m():a=34
A2::m(),a=32432
A1::a=34
A2::a=32432
*/
上面是两个基类有同样名称和形式的函数,都被继承到了子类中。访问他们的时候,要加上作用域才能正确地访问。
进一步来看,如果两个类都从同一个类派生,并没有重写某些函数,再有一个子类继承了它们两个。[共同基类产生的二义性]
情况就和上面类似了。代码如下:
#include <iostream>
using namespace std;
#include <string> class A
{
public:
int m_ax;
void show(); A();
A(int a); };
A::A()
{ }
A::A(int val)
{
this->m_ax = val;
} void A::show()
{
cout << "A::m_ax = "<<m_ax<<endl;
}
class B1: public A{ };
class B2: public A{ };
class C: public B1 ,public B2 {
public:
int m_cx;
void show();
};
void C::show()
{
//cout<<"c::show: m_ax = "<<m_ax<<endl;// error C2385: 对“m_ax”的访问不明确
cout<<"c::show: A::m_ax = "<<A::m_ax<<endl;
cout<<"c::show: B::m_ax = "<<B1::m_ax<<endl;
cout<<"c::show: B::m_ax = "<<B2::m_ax<<endl;
//从A、B1、B2派生下来的函数以及变量,在类C里面都得以保存,并各自占各自的独立的空间。
//eg:尽管m_ax最初源于A类,但是派生到C类里面的有三个不同的m_ax。对于方法,同理。
}
int main()
{
C c1 ;
c1.show(); //c1.m_ax = 11;//error C2385: 对“m_ax”的访问不明确
c1.B1::m_ax = ;
c1.B1::show(); while();
return ;
}
专门解决共同基类产生的二义性的办法还有虚基派生。
见另一篇:
c++, 虚基派生 : 共同基类产生的二义性的解决办法
http://www.cnblogs.com/mylinux/p/4096926.html
c++,多继承造成的二义性及解决办法的更多相关文章
- 【转】C++中多重继承的二义性及解决办法
转自:http://www.cnblogs.com/lintong/archive/2012/07/28/2613002.html 1. 什么是多重继承的二义性 class A{ public: vo ...
- c++, 虚基派生 : 共同基类产生的二义性的解决办法
虚基派生 //虚继承 #include <iostream> using namespace std; #include <string> //---------------- ...
- 关于android:windowNoTitle不起作用的解决办法
今天测试一个新功能的时候,在styles.xml设置<item name="android:windowNoTitle">true</item>并没有生效, ...
- 继承在WCF中的问题和解决办法
1. 问题 假设有代码如下: [ServiceContract] public interface IA { [OperationContract] string M1(); } [ServiceCo ...
- maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题
maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题 子类在引用时候 不需要加上版本号
- C#使用ListView更新数据出现闪烁解决办法
C#使用ListView更新数据出现闪烁解决办法 在使用vs自动控件ListView控件时候,更新里面的部分代码时候出现闪烁的情况 如图: 解决以后: 解决办法使用双缓冲:添加新类继承ListView ...
- Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法
问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...
- Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...
- “maven编码gbk的不可映射字符”解决办法
一.问题描述 Eclipse中使用Maven编译项目源代码时,如下的错误 java源代码在Eclipse中显示是没有任何错误的,可是执行"maven install"命令编译项目时 ...
随机推荐
- 浮点数(double)的优势
用 double 处理大数据 , 即使字符串位数超百位,同样可以用 sscanf 或 atof 来处理,却不会变成负数,原因是浮点数可以用指数表示,但精度会丢失,下面介绍利用这个性质解决的一些问题: ...
- BZOJ 1497: [NOI2006]最大获利( 最大流 )
下午到周六早上是期末考试...但是我还是坚守在机房....要挂的节奏啊.... 这道题就是网络流 , 建图后就最大流跑啊跑啊跑... --------------------------------- ...
- relative、absolute和float
relative.absolute和float position:relative和position:absolute都可以改变元素在文档中的位置,都能激活元素的left.top.right.bo ...
- https tomcat 证书搭建
首先生成证书说明 keytool -genkey -alias castest -keyalg RSA -keystore c:/keys/caskey 先让输入密码,密码必须记住,下面会用到 其中“ ...
- DC游戏《斑鸠》原创赏析[转载]
游戏背景: 凤来之国本来只是边远地区的一个小国.但现在他们却自称为得到“神之力”的“神通者”,在“选民思想”“和平统一”之类的名义下开始了对各地的武力侵略. 事情的起因是因为凤来之 ...
- css为网页顶部和底部都加入背景图
网页背景图是我们常用的功能,一般来说.给网页加一个背景图,只要在网页的body标签中加入css属性就行. 代码如下:<body style="background-image:url( ...
- 从51跳新唐cortex-m0学习1——思想转变
Cortex-M0学习第一帖 序言:这里先说一下,大家在看帖子时候,可能看见字数比较多的,可能只是先大概浏览一下,之后从中挑几段大概瞅瞅,但是我要说,如果你碰到一个适合的帖子,请仔细品读,这是我在论坛 ...
- Apache 错误代码配置
ErrorDocument 400 /error_pages/400.htmlErrorDocument 401 /error_pages/401.htmlErrorDocument 403 /err ...
- QQ聊天原理初识
1:qq之间文件的传输是通过p2p通信进行的. 2:qq之间的表情发送实际上就是文字的发送,是client再接受到文字之后在本地自己进行转换 3:qq之间的通信既能够通过udp也能够通过Tcp 尽管u ...
- mac下配置cocos2d-x3.0
今天看到3.0的正式版公布了,就马上荡下来试试3.0,以下记录下环境变量配置过程 打开用户文件夹下.bash_profile文件,配置环境 1.首先配置下android sdk,我的是在opt文件夹下 ...