ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

条款40: 明智而审慎地使用多重继承

2020-12-08 21:58:18  阅读:238  来源: 互联网

标签:OutputFile 继承 40 class 明智 virtual File 审慎 public


考虑如下代码:

class BorrowableItem {	// 图书馆允许你借某些东西
public:
	void checkout();		// 离开时检查
	// ...
};

class ElectronicGadget {
private:
	bool checkout() const;	// 执行自我检测,返回是否检测成功
};

// 多继承
class Mp3Player : public BorrowableItem, public ElectronicGadget {
	// ...
};

MP3Player mp;
mp.checkOut();	// 歧义,调用的是哪个checkout?

为了解决这个歧义,你必须明白指出你要调用哪一个base class内的函数:

mp.BorrowableItem::checkOut();

当遇到钻石继承时候的情况呢?考虑如下代码:

class File {};
class InputFile : public File {};
class OutputFile : public File {};
class IOFile : public InputFile, public OutputFile{};

如果File class有个成员变量filenName,那么IOFile内该有多少笔这个名称的数据(一或者二份?),C++的缺省做法是执行复制(2份);如果这不是你想要的,你必须令那个带有数据的class(也就是File)成为一个virtual base class:

class File {};
class InputFile : virtual public File {};
class OutputFile : virtual public File {};
class IOFile : public InputFile, public OutputFile{};

但是要注意到:使用virtual继承那些classes所产生的对象往往比使用non-virtual继承的体积大,访问virtual base classes的成员变量时,也比访问non-virtual base classes的成员变量速度慢;

  • 多重继承的确有正当用途;其中一个情节涉及"public 继承某个Interface class"和"private继承某个协助实现的`class``"的两相结合

标签:OutputFile,继承,40,class,明智,virtual,File,审慎,public
来源: https://blog.csdn.net/L_H_L/article/details/110769198

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有