c++多重继承小结
如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们。
即在从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++多重继承小结的更多相关文章
- python基础——多重继承
python基础——多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat ...
- Cpp多重继承会产生的问题
多重继承常常被认为是 OOP 中一种复杂且不必要的部分.多重继承面临 crash 的场景并非难以想象,来看下面的例子. 1. 名称冲突 来看以下情况: 如果 Dog 类以及 Bird 类都有一个名为 ...
- C++重要知识点小结---2
C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继 ...
- java中接口与多重继承的关系
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
- Java 相关注意事项小结
程序是一系列有序指令的集合: Java主要用于开发两类程序: 1)桌面应用程序2)Internet应用程序1,Java程序:三步走,编写--编译--运行:2,使用记事本开发:1)以.java为后缀名保 ...
- Chapter 16_3 多重继承
在Lua中进行面向对象编程时有几种方法,上一小结介绍了一种使用__index元方法的做法. 下面要介绍另一种方法,可以在Lua中实现多继承. 关键一点,在于用函数作为__index元字段. 多重继承意 ...
- C++ 深入理解 虚继承、多重继承和直接继承
[摘要] 本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承.虚继承与多重继承,几个交叉概念,详细的阐释了继承.虚函数与虚继承的基本概念,深入剖析了继承于虚 ...
- Java 基础--小结
Java 基础--小结 java基础 Java源程序(.java文件)——>java字节码文件(.class文件)——>由解释执行器(java.exe)将字节码文件加载到java虚拟机( ...
- 《C++ Primer Plus》14.3 多重继承 学习笔记
多重继承(MI)描述的是有多个直接基类的类.与单继承一样,共有MI表示的也是is-a关系.例如,可以从Awiter类和Singer类派生出SingingWaiter类:class SingingWai ...
随机推荐
- servlet 学习(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Ubuntu 12.04 64bit系统下安装的vsftpd,在登陆时提示500 OOPS: vsftpd: refusing to run with writable root inside chr ...
- Apache 反向代理实现为http添加https的外衣
Apache 反向代理 金天:坚持写东西,不是一件容易的事,换句话说其实坚持本身都不是一件容易的事.如果学习有捷径,那就是不断实践,不断积累.写笔记,其实是给自己看的,是体现积累的一种方式,要坚持. ...
- Oracle 时间差计算
两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒): 天: ROUND(TO_NUMBER(END_DATE - START_DAT ...
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
曾今有件事情让我记忆犹新,那年刚来携程不久,马上就被安排写一个接口,供企鹅公司调用他们员工的差旅信息,然后我就三下五除二的给写好 了,上线之后,大概过了一个月...DBA那边报告数据库出现大量锁超时, ...
- JAVA_OPTS
JAVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. JVM:JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k" -s ...
- jqGrid 学习笔记--数据异步加载方法(转)
var commonQuery = '../importantInfoReport/pageQueryImportantInfoReport.action?type=0'; jQuery(" ...
- PHP MSSQL 分页实例(刷新)
<?php/* '页面说明:*/ $link=mssql_connect("MYSQL2005","sa","123456") or ...
- 使用SQL语句创建SQL数据脚本(应对万网主机部分不支持导出备份数据)
1.查询待导出表Ad中的数据. SELECT * FROM [DB_Temp].[dbo].[Ad] 2.编写存储过程. --将表数据生成SQL脚本的存储过程 CREATE PROCEDURE dbo ...
- dos2unix用法
windows下编写的脚本,上传到linux上执行,有时会出现莫名其妙的结果,也是折腾了半天才找出原因,windows和linux有些编码不同,经dos2unix处理后,结果一切正常man dos2u ...