C++进阶--多继承
//###########################################################################
/*
* 多继承
*
* -- 一个类直接派生自不止一个基类
*
* -- 利弊?
*/
//###########################################################################
/*
* 多继承
*/
class InputFile {
public:
void read();
private:
void open();
};
class OutputFile {
public:
void write();
void open();
};
class IOFile : public InputFile, public OutputFile {
};
int main() {
IOFile f;
}
// Notes:
// void open();
// f.open(); //这里编译不过,即使其中一个是私有函数。因为函数匹配性检查在权限检查之前
//正确的调用方式:
//f.Output::open();
//两者类都存在open函数,改进成如下方式
class File { // File
public: // / \ -
string name; // InputFile OutputFile
void open(); // \ /
}; // IOFile
class InputFile : virtual public File {
};
class OutputFile : virtual public File {
};
class IOFile : public InputFile, public OutputFile {
}; // 菱形继承
int main() {
IOFile f;
f.open(); //但是这样仍然编译不过,open()二义性
//f.InputFile::name = "File1"; //不仅open有两个,name也有两个
//f.OutputFile::name = "File2";
}
//解决方式: 虚继承
//但是引入了一个新问题,基类的初始化用哪个?
//C++提供了在最终派生指定的一个解决办法
class File {
public:
File(string fname);
};
class InputFile : virtual public File {
InputFile(string fname) : File(fname) {} //这边的File(fname)会被忽略
};
class OutputFile : virtual public File {
OutputFile(string fname) : File(fname) {} //这边的File(fname)会被忽略
};
class IOFile : public InputFile, public OutputFile {
IOFile(string fname) : OutputFile(fname), InputFile(fname), File(fname) {} //不管派生类有多远,都要负责初始化虚基类
};
int main() {
IOFile f;
}
// 既然有这些问题,为什么要用多继承?
/*
* 接口隔离原则
*
* 将大的接口分割成更小且更专用的接口。从而使用户只需要知道他们感兴趣的方法
*/
//例如,Andy可能总共有500个API,但是如果你只关心他作为工程师的特性,你只需要知道工程师的40个API
class Engineer {
public:
...; // 40 APIs
};
class Son {
public:
...; // 50 APIs
};
...
class Andy : public Engineer, Son {
public:
...; // 500 APIs
};
/*
* ISP的好处:
* 1. 接口易于使用
* 2. 静态类型安全
*/
/*
// 那么怎么样在享受多继承的好处的同时,避免前面提到的问题
* 【纯虚类】
*
* 虚类: 有一个或多个纯虚函数的类
*
* 纯虚类:
* 一个类只包含纯虚函数
* - 没有数据
* - 没有实体函数
* - 没有私有和保护的函数
*/
class OutputFile {
public:
void write() = 0; //没有初始化及二义性的问题
void open() = 0;
};
/*
* 总结:
* 1. 多继承是一个重要的技术, 即 接口隔离原则
* 2. 在使用多继承时只从纯虚类派生
*/
C++进阶--多继承的更多相关文章
- ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase
原文地址:http://www.51csharp.com/MVC/882.html ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL 引言-- 在初级篇中,我们 ...
- python进阶03 继承
python进阶03 继承 一.继承 课堂练习:假设你正在参与一个魔幻类角色游戏的开发,公司需要腻味这个游戏设计两个角色的类: a.剑士 属性:1.角色名:2.角色等级:3.生命值:4.攻击力 行为: ...
- ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC ...
- [转载]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将 ...
- [转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
本文转自:http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NE ...
- 前端入门14-JavaScript进阶之继承
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...
- C++进阶--公有继承的二元性
//########################################################################### /* * 公有继承的两元性 * * - 接口 ...
- Ruby中类的进阶(继承,private, public, protect)
类中的public,protect,private public method class Point def test end end 这样定义的test方法就是一个public方法可以在类内外使用 ...
- Python进阶-XVI 继承 单继承 多继承
一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...
随机推荐
- React两三事
在setState中改变变量的状态应该用,this .state....而不是 this.props...
- guling code细节
detect_hand.py 分水岭算法: 任何一幅灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷.我们向每一个山谷中灌不同颜色的水,随着水的位的升高,不 ...
- 2018.4.23 git删除已经add的文件
使用 git rm 命令即可,有两种选择, 一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除: 一种是 git rm --f " ...
- CentOS右键菜单添加新增文件命令
进入模板文件夹, 增加空白文件即可. cd /home/tom/Templatesvi text01.txt //新增一个名为text01的文本文件. :wq //保存退出. 另外可以用LibreOf ...
- springboot+kotlin+springcloud+java+grade+maven混编?
springboot + maven + java vs springboot + gradle + kotlin 快速搭建:https://start.spring.io/ springclould ...
- 20165313 《Java程序设计》第二周学习总结
教材学习总结 这周我主要学习了教材上的二,三两章.其基本内容就是数据与语句的表达与基本的运用.其中重点要理解并掌握的是: 1.Scanner的运用:利用该类创建对象就可以完成要求用户输入这一要求.类似 ...
- 【Jmeter】分布式并发测试
一.前提: 1.最近在做一下压测,但是单台服务器的CPU,内存可能不够支撑压测的项目,这时候,我们可以使用Jmeter分布式压测. 2.本次使用的环境: 1台服务器做master(调度器) 5台服务器 ...
- 【java编程】String拼接效率探究
转载:https://maimai.cn/article/detail?fid=1139790318&efid=0-ey6pWIySdmkx82QO-OSw 字符串,是Java中最常用的一个数 ...
- getpwnam,getgrnam,getpwent,crypt等函数
[root@bogon code]# cat a.c #include<stdio.h> #include<pwd.h> int main() { struct passwd ...
- MySQL Network--Localhost与127.0.0.1的差异
localhost为本地服务器,而127.0.01为本机地址.在使用localhost时不经过网卡传输,不受网络防火墙和网卡相关的限制,访问localhost不会被解析成ip地址,不会占用网卡和网络资 ...