转自: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++中多重继承的二义性及解决办法的更多相关文章

  1. c++,多继承造成的二义性及解决办法

    #include <iostream> using namespace std; //------------------------------- class A1{ public: i ...

  2. iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】

    在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...

  3. MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)

    问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Font ...

  4. 虚拟机中不能连接usb设备解决办法

    虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...

  5. Aasible中cryptography兼容性报错解决办法

    Aasible中cryptography兼容性报错解决办法 1 Ansible中使用ansible --version查看版本,报错信息如下: ERROR! Unexpected Exception, ...

  6. windows10中git-bash闪退的解决办法

    windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...

  7. SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法

    .NET 中 SVN版本冲突中 Files 的值“ < < < < < < < .mine”无效路径中具有非法字符的解决办法: 一. 1.将项目逐个进行编译, ...

  8. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法

    如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...

  9. iOS cocopods安装使用和安装过程中遇到的问题及解决办法

    在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...

随机推荐

  1. 双缓冲(Double Buffer)原理和使用

    转自双缓冲(Double Buffer)原理和使用 一.双缓冲作用            双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和& ...

  2. HDU3362+状态压缩

    dp[ i ]表示该状态下得所需花费. /* 状态压缩dp dp[i] = min( dp[ i-j ]+cost[ j ] ); 由i-j的状态转到i的状态 */ #include<stdio ...

  3. Log4j配置全说明

    转载:http://zhangjunhd.blog.51cto.com/113473/21014/ 1.Log4j简介 Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息.Lo ...

  4. 解决eclipse+tomcat7的中文乱码的一个方法

    我用的eclipse+tomcat7进行开发部署个一个项目,在页面展示的时候出现中文乱码,我想尽了所有方法,eclipse开发环境可以配置成utf-8的地方都进行了配置,tomcat也进行了配置URI ...

  5. 怎样在WINDOWS下面编译LIBCURL

    我测试过,好像没OK This is a short note about building cURL with SSL support on Windows. Tools required: cUR ...

  6. 如何将Springside4项目转成Eclipse项目

    1)下载springside4 官网地址 http://www.springside.org.cn/download.html 2)运行CMD,进入 C:\Documents and Settings ...

  7. Drawable(3)Color State List Resource

    注意 Color State List Resource 与 Color不同,前者是颜色状态表.根据不同状态显示不同颜色,它是State list,里面有多种颜色,后者只是一个颜色. Color St ...

  8. c#使用XSLT将xml文档转换为html文档

    需要引用下面的命名空间: using System.Xml; using System.Xml.Xsl; 方法实现: public static string ConvertXML(XmlDocume ...

  9. write & read a MapFile(基于全新2.2.0API)

    write & read a  MapFile import java.io.IOException; import org.apache.hadoop.io.IntWritable; imp ...

  10. 小图用 imageNamed: 大图用 dataWithContentsOfFile:options

    1down voteaccepted If you're loading images like:[UIImage imageNamed:@"myImage.png"];Then ...