如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们。

即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法

如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径分别继承非虚基类的一个实例。多个基类

都是有问题的。使用虚基类的MI,当派生类使用关键字virtual来指示派生时,基类就成为虚基类:

class A:public virtual B

{}

主要变化是,从虚基类的一个或多个实例派生而来的类将只继承了一个基类。对实现这种特性,必须满足其他要求:

1》有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的;

2》通过优先规则解决名称二义性。

MI会增加编程的复杂程度,然而这种复杂性主要是由于派生类通过多条途径继承同一个基类引起的。避免这种情况后

唯一需要注意的是必要时对继承的名称进行限定

#include<iostream>
using namespace std;
class A
{
int a;
public:
A(int n=):a(n)
{
cout<<"A"<<endl<<" int a="<<a<<endl;
};
}; class B:public virtual A
{
int b;
public:
B(const A & a,int m=,int n=):A(n),b(m)
{
cout<<"B"<<endl<<" int b="<<b<<endl;
};
}; class D:public virtual A
{
int d;
public:
D(const A & a,int m=,int n=):A(n),d(m)
{
cout<<"D"<<endl<<" int d="<<d<<endl;
};
}; class C :public B,public D
{
int c;
public : /*C(const A & a ,int q=0,int m=0,int n=0):B(a,m,n),D(a,m,n),c(q)
{
cout<<"C"<<endl<<" int c="<<c<<endl;
};*/
//上边将通过两种不同的途径把a传递给A这会有二义性
//c++在使用虚基类时禁止信息通过中间类自动传递给基类
//因此上面的构造函数将初始化B类的bw但和D类的d,a不会传递给子对象b也不会传递给D对象
//会调用A的默认无参构造函数
//所以必须在构造派生对象之前构造基类对象组件,如果不希望默认构造函数来构造虚对象,则需要显式地调用
//所需基类构造函数因此应该这样
C(const A & a ,int q=,int m=,int n=):A(a),B(a,m,n),D(a,m,n),c(q)
{
cout<<"C"<<endl<<" int c="<<c<<endl;
};
//上述代码将显示的调用A(const A &)这样做是合法的,对于虚类必须这样做,对于非虚基类,则是非法的。
//如果类有间接虚基类,除非只需使用该虚基类的默认构造函数,否则必须显式地调用该虚基类的某个构造函数
}; int main()
{ A * a=new A();
//D(a,1,2);
C c(*a,,,);
cin.get();
}

c++多重继承小结的更多相关文章

  1. python基础——多重继承

    python基础——多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat ...

  2. Cpp多重继承会产生的问题

    多重继承常常被认为是 OOP 中一种复杂且不必要的部分.多重继承面临 crash 的场景并非难以想象,来看下面的例子. 1. 名称冲突 来看以下情况: 如果 Dog 类以及 Bird 类都有一个名为 ...

  3. C++重要知识点小结---2

    C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继 ...

  4. java中接口与多重继承的关系

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

  5. Java 相关注意事项小结

    程序是一系列有序指令的集合: Java主要用于开发两类程序: 1)桌面应用程序2)Internet应用程序1,Java程序:三步走,编写--编译--运行:2,使用记事本开发:1)以.java为后缀名保 ...

  6. Chapter 16_3 多重继承

    在Lua中进行面向对象编程时有几种方法,上一小结介绍了一种使用__index元方法的做法. 下面要介绍另一种方法,可以在Lua中实现多继承. 关键一点,在于用函数作为__index元字段. 多重继承意 ...

  7. C++ 深入理解 虚继承、多重继承和直接继承

    [摘要] 本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承.虚继承与多重继承,几个交叉概念,详细的阐释了继承.虚函数与虚继承的基本概念,深入剖析了继承于虚 ...

  8. Java 基础--小结

    Java  基础--小结 java基础 Java源程序(.java文件)——>java字节码文件(.class文件)——>由解释执行器(java.exe)将字节码文件加载到java虚拟机( ...

  9. 《C++ Primer Plus》14.3 多重继承 学习笔记

    多重继承(MI)描述的是有多个直接基类的类.与单继承一样,共有MI表示的也是is-a关系.例如,可以从Awiter类和Singer类派生出SingingWaiter类:class SingingWai ...

随机推荐

  1. Oracle BIEE 环境迁移所导致的账号登陆问题的解决

    系统版本 系统版本:11G(11.1.1.9) 问题描述 将系统数据(RPD.catalog等数据)迁移到另一环境(版本同样为11G)后,老系统weblogic控制台中添加的账户在新系统(仪表盘)中无 ...

  2. Redis简介

    Redis是一个偏重于in-memory的key-value数据库,这样讲有点儿不准确,但是很容易将Redis简单分类.更准确的讲Redis是一个数据结构的存储服务.它的value不仅仅只有strin ...

  3. 【Android】apk文件反编译

    工具: 压缩软件:用于解压apk包 dex2jar:*.dex反编译为Jar包 jd-gui:查看Jar文件 (PS:不知道博客园如何上传附件,只能把工具挂到百度网盘了:http://pan.baid ...

  4. Visual Studio 2012中文旗舰版(序列号和下载地址)

    序列号:YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 链接: http://pan.baidu.com/s/1pLGhDjl 密码: 3udq

  5. proxool 连接池警告分析:appears to have started a thread named [HouseKeeper] but has failed to stop it

    1. 问题:日志中出现下面的警告: 警告: The web application [ROOT] appears to have started a thread named [HouseKeeper ...

  6. 初步认识Hive

    初步认识Hive hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习 ...

  7. json字符串的拼接,并转换为json对象

    <html> <head> <script> var qianzhui = "cc"; var test1=""; func ...

  8. 为IIS站点添加限制IP

    /// <summary> /// 添加站点限制IP /// </summary> /// <param name="sitename">站点名 ...

  9. Mysql数据库上修改日期-->造数据

    这次要给客户安装测试ineedle设备,但是安装后不会立刻有数据显示,不能够全面的展示给用户web界面的一些信息.此时需要有一个公网服务器能够展示一下ineedle统计数据,但是公司58设备上没有流量 ...

  10. 关于/etc/rc.local以及/etc/init.d

    1. /etc/rc.local    这是使用者自订开机启动程序,把需要开机自动运行的程序写在这个脚本里   --------引用----------------------  在完成 run le ...