//###########################################################################
/*
* 多继承
*
* -- 一个类直接派生自不止一个基类
*
* -- 利弊?
*/ //###########################################################################
/*
* 多继承
*/ 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++进阶--多继承的更多相关文章

  1. ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase

    原文地址:http://www.51csharp.com/MVC/882.html   ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL 引言-- 在初级篇中,我们 ...

  2. python进阶03 继承

    python进阶03 继承 一.继承 课堂练习:假设你正在参与一个魔幻类角色游戏的开发,公司需要腻味这个游戏设计两个角色的类: a.剑士 属性:1.角色名:2.角色等级:3.生命值:4.攻击力 行为: ...

  3. ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

    http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC ...

  4. [转载]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

    引言-- 在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由.也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值,我们无法将 ...

  5. [转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

    本文转自:http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NE ...

  6. 前端入门14-JavaScript进阶之继承

    声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...

  7. C++进阶--公有继承的二元性

    //########################################################################### /* * 公有继承的两元性 * * - 接口 ...

  8. Ruby中类的进阶(继承,private, public, protect)

    类中的public,protect,private public method class Point def test end end 这样定义的test方法就是一个public方法可以在类内外使用 ...

  9. Python进阶-XVI 继承 单继承 多继承

    一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...

随机推荐

  1. unity ugui Toggle Group详解(Chinar出品、简单易懂)

    UGUI Toggle Group用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar ...

  2. 用jq修改css

    $(".tag_add").css("background","#ffffff"); $(".tag_add").css ...

  3. HPU第四次积分赛-L:A Winged Steed(完全背包)

    A Winged Steed 描述 有n种千里马,每一种都有若干匹,第i种马的颜值ai​,价格di​.现有m个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和} ⩾Ai​.现在 ...

  4. 2018.4.17 VFS

    总结: VFS只存在于内存中,它在系统启动时被创建,系统关闭时注销. VFS的作用就是屏蔽各类文件系统的差异,给用户.应用程序.甚至Linux其他管理模块提供统一的接口集合. 管理VFS数据结构的组成 ...

  5. django CBV和FBV写法总结

    一.FBV function base views 平常我们的写法,一个URL对应一个视图函数 二.CBV 1.url 配置 path('test/',views.CBVTest.as_views() ...

  6. html和vue框架

    HTML写的页面,每次跳转的时候都要向服务器请求 vue框架:单页面运用,路由的跳转,方便

  7. web网页【2】

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...

  8. keydown,keypress,keyup三者之间的区别

    最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件 ...

  9. 主机-配件-接口-整机-3c-1

    standby 待机 hibernate 休眠(睡眠) power-off 关机 usb端口能给外部设备充电在低压状态(standby,hibernate,power-off),如果系统运行在batt ...

  10. 第1节 常用DOS(磁盘操作系统)命令

    一.打开DOS命令窗口 1)快捷键:win + r,打开命令提示符窗口: 2)左击“开始”菜单,在运行里输入cmd,按回车打开命令提示符窗口: 二.常见命令 1)文件夹操作: d:+ 回车:盘符切换 ...