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 ...
随机推荐
- 关于update set from where
http://blog.csdn.net/xcbsdu/article/details/6736503 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值 ...
- java 生成和解析二维码
public class QRCode { /** * 解析二维码(QRCode) * @param imgPath * @return */ public static String decoder ...
- java 读写word java 动态写入 模板文件
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...
- python爬取并下载麦子学院所有视频教程
一.主要思路 scrapy爬取是有课程地址及名称 使用multiprocessing进行下载 就是为了爬点视频,所以是简单的代码堆砌 想而未实行,进行共享的方式 二.文件说明 itemsscray字段 ...
- YUV420查表法高效、无失真的转换为RGB32格式
YUV格式有两大类:planar和packed.planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,这里所讲述的就是这中存储格式的:packed的YUV ...
- iOS 判断内容是否是中文,两种实现
用category实现 新建类别文件,代码 .h文件 #import <Foundation/Foundation.h> @interface NSString (Valid) - (BO ...
- raspberry pi2 智能小车源码及测试视频
作者:XIAOBO QQ:463431476 转载请注明作者Python 源代码 import RPi.GPIO as GPIO #human-computer-interaction import ...
- c++整型->字符型转换
有itoa(),atoi(),sprintf()三个函数 使用字符串流: #include<iostream> #include<string> #include<sst ...
- 代理模式 vs 装饰模式
代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的.下面分别讲解代理模式和装饰模式. 1.代理模式 一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理 ...
- 最小生成树POJ3522 Slim Span[kruskal]
Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7594 Accepted: 4029 Descrip ...