C++多重继承实践
实践代码如下:
#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++多重继承实践的更多相关文章
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- python高级编程之选择好名称:pepe8和命名最佳实践
# # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' # my_list=['a','b','c','d'] ...
- python高级编程之最佳实践,描述符与属性01
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的 ...
- 《程序设计语言——实践之路》【PDF】下载
程序设计语言--实践之路>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- Django入门与实践 17-26章总结
Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到 ...
- 《C+编程规范 101条规则、准则与最佳实践》笔记
<C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...
- 2013级C++第12周(春)项目——成员的訪问属性、多重继承
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读 1.阅读程序.分析类中成员 ...
- webp图片实践之路
最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...
随机推荐
- pt-archiver配置自动归档
Mysql的数据归档通常使用percona的pt-archiver.通过shell脚本加crontab可以应对大多数场景下的数据自动归档. 安装 Percona Toolkit的安装不再赘述,请自行搜 ...
- MySQL select之后再update
1.先查询页面 而后再根据查询的结果来更改数据库,可以使用SELECT …… FOR UPDATE 来实现,具体的代码如下 SELECT * FROM chat //查询的表 //查询的条件 FOR ...
- 2.(基础)tornado的请求与响应
之前我们介绍了tornado 的基础流程,但是还遗留了一些问题,今天我们就来解决这些遗留问题并学习新的内容 settings,使用tornado.web.Application(handler, ** ...
- 1.K近邻算法
(一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...
- kubernetes管理存储
一.Kubernetes 如何管理存储资源: 理解volume 首先我们学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Vol ...
- Spring笔记之配置数据源
任何DAO访问数据库,最开始都需要配置数据源,数据源中定义了访问数据库的常用配置.有了数据源才能创建数据模板,然后把数据模板注入到DAO中,通过调用数据访问模板中的相应方法来对数据库进行相关操作. 常 ...
- zencart目录结构
zencart目录结构 文件路径 注释 index.php 主文件 includes/templates/[custom template folder]/common/html_header.php ...
- 第二章 Vue快速入门-- 18 v-for中key的使用注意事项
注意:如果属性和方法还没定义直接使用的话,就会报 xxx is not defined 导致界面不能正常显示.我看视频教程里老师的可以直接使用,而且界面正常显示,可能是vue版本不同吗?还不清楚 ...
- python3之selenium.webdriver 库练习自动化谷歌浏览器打开百度自动百度关键字
import os,time,threading from selenium import webdriver from selenium.webdriver.common.keys import K ...
- Dubbo配置文件详解
为新项目练手,把项目中用到的web service.RMI的服务改用Dubbo+Zookeeper+Spring,网上找到几篇不错的配置详解 1.此篇博文主要从以下几种配置方式来讲 XML 配置文件方 ...