实践代码如下:

#include <iostream>
using namespace std; class Animal { private:
int hash; public:
Animal() {
hash = ;
cout << "Animal构造器, hash:" << hash << endl;
}
virtual ~Animal() {
}
int getHash() {
return hash;
}
}; class Bird: virtual public Animal {
public:
Bird() {
cout << "Bird构造器" << endl;
}
void fly() {
cout << "鸟在天上飞~~~" << endl;
}
void eat() {
cout << "鸟吃东西~~~" << endl;
}
};
class Fish: public virtual Animal {
public:
Fish() {
cout << "Fish构造器" << endl;
}
virtual ~Fish(){ }
void fly() {
cout << "鱼在水里游~~~" << endl;
}
virtual void eat() {
cout << "鱼吃东西~~~" << endl;
}
}; // 构造器由继承顺序从左往右初始化
// #No1. 多继承时,子类都继承animal基类,此时animal构造器会调用多次, java C#等单继承也是设计者充分考虑这个问题
class BirdFish: public Bird, public Fish { public:
BirdFish() {
cout << "BirdFish构造器" << endl;
}
// #No2.若没有下面eat方法,两个子类都有eat方法,当调用BirdFish.eat时会报: eat is ambiguous: 模棱两可的 candidates: 候选人 here, 编译不通过,提示二义性
// 若只有一个子类有eat方法则不会报错
void eat() {
cout << "飞鸟吃东西~~~" << endl;
}
void action() {
cout << "飞鸟既能飞又能游泳~~~" << endl;
}
}; int main() { cout << "多重继承实践:" << endl; cout << "申明子类但调用父类:" << endl;
BirdFish bf;
bf.action();
bf.eat();
bf.Bird::eat();
bf.Fish::eat(); cout << "\n多态,申明父类 调用子类:" << endl;
Fish *fish = &bf;
// #No3.若父类的方法不申明为virtual, 则调用不到子类方法
fish->eat(); cout << "\n多重继承end." << endl; return ;
}

输出:

总结:

#No1. 多继承时,子类都继承animal基类,此时animal构造器会调用多次, java C#等单继承也是设计者充分考虑这个问题
#No2.若没有下面eat方法,两个子类都有eat方法,当调用BirdFish.eat时会报: eat is  ambiguous: 模棱两可的 candidates: 候选人 here, 编译不通过,提示二义性
若只有一个子类有eat方法则不会报错
#No3.若父类的方法不申明为virtual, 则调用不到子类方法

C++多重继承实践的更多相关文章

  1. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则

    第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...

  2. python高级编程之选择好名称:pepe8和命名最佳实践

    # # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' # my_list=['a','b','c','d'] ...

  3. python高级编程之最佳实践,描述符与属性01

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的 ...

  4. 《程序设计语言——实践之路》【PDF】下载

    程序设计语言--实践之路>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...

  5. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  6. Django入门与实践 17-26章总结

    Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到 ...

  7. 《C+编程规范 101条规则、准则与最佳实践》笔记

    <C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...

  8. 2013级C++第12周(春)项目——成员的訪问属性、多重继承

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读 1.阅读程序.分析类中成员 ...

  9. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

随机推荐

  1. 免费数学神器Mathpix发布移动版了,一起来写更快的公式

    目录 1. 按 2. 下载地址 3. 介绍和使用 3.1. 介绍 3.2. 实际使用体验 1. 按 本文介绍的Mathpix可用于将手写的公式通过拍照或截图转成LaTeX 表达式. 写博客.记笔记最麻 ...

  2. Delphi FileListBox组件

  3. Linux硬件访问技术

    在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者RAM地址则是物理地址,无法直接使用,因此,我们读写寄存器的第1步就是将将它的物理地址映射为虚拟 ...

  4. Vue基础组件

    本文章仅用作于个人学习笔记(蓝后我就可以乱写啦)复制代码 一.组件化的优点当TodoList的todo item越来越多的时候,我们应该把它拆分成一个组件进行开发,维护.组件的出现,就是为了拆分Vue ...

  5. mvc 母版页中登录注册和问候的处理

    方式一:    在母版页直接调用方法返回,用户的session["userName"]也在母版页判断 2. 创建一个局部视图,在局部试图中将代码和数据调用写好引用单母版页 3. 自 ...

  6. 根据IP 自动识别国家和城市

    https://www.jianshu.com/p/1b1a018ae729 根据IP 自动识别国家和城市

  7. 多线程(三) 同步synchronized

    五.同步 1.锁 多线程程序一般是为了完成一些相同的工作而存在的,因此有时间也会共享一些资源,例如对象.变量等等,此时如果不对各个线程进行资源协调,就会出现一些冲突,从而导致程序功能失效.例如下面的示 ...

  8. sizeof运算符、虚函数、虚继承考点(待修改)

    参考: http://blog.csdn.net/wangyangkobe/article/details/5951248 下面的文章解释有错误,不要看.......... 记住几句话: 编译器为每个 ...

  9. 【转】linux中fork()函数详解

    原文链接:http://blog.csdn.net/jason314/article/details/5640969#comments 总结:面宝P268 fork()的意思是进程从这里开始分叉,分成 ...

  10. 当心JavaScript奇葩的逗号表达式

    看看下面的代码输出什么? let a = 2; switch (a) { case (3, 2, 5): console.log(1); break case (2, 3, 4): console.l ...