Effective C++ Item 40 明智而审慎地使用多重继承

Effective C++ Item 40 明智而审慎地使用多重继承

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

经验:多重继承比单一继承复杂。它可能导致新的歧义性,以及对 virtual 继承的须要

演示样例:

class BorrowableItem{
public:
	void checkOut();
};
class ElectronicGadget{
private:
	bool checkOut() const;
};
class MP3Player:
	public BorrowableItem
	public ElectronicGadget
{...};
MP3Player mp;
mp.checkOut()

解析:找出最佳函数后才检验其可取用性。此例中对 checkOut 的调用是歧义的,即使两个函数中仅仅有一个是可取用的(一个 public , 一个 private)

纠正:明白说明调用的是哪一个 base class 内的函数

mp.BorrowableItem::checkOut();

经验: virtual 继承会添加�大小、速度、初始化(及赋值)复杂度等等成本。假设  virtual base classes 不带不论什么数据,将是最具有用价值的情况

经验:多重继承的确有正当用途。当中一个情节涉及“public 继承某个 Interface class”和”private继承某个协助实现的 class”的两相组合。

演示样例:

class IPerson{ //提供接口
public:
	static std::tr1::shared_ptr<Person> makePerson(DatabaseID personIdentifier);
	virtual ~IPerson();
	virtual std::string name() const = 0;
	virtual std::string birthDate() const = 0;
};


class PersonInfo{ //提供实现
public:
	explicit PersonInfo(DatabaseID pid);
	virtual ~PersonInfo();
	virtual const char *theName() const;
	virtual	const char *theBirthDate() const;
	virtual const char *valueDelimOpen() const;
	virtual const char *valueDelimClose() const;
	//...
};


class CPerson: public Iperson, private PersonInfo{
public:
	explicit CPerson(DatabaseID pid): PersonInfo(pid){}
	virtual std::string name() const{ 
		return PersonInfo::theName(); //利用 PersonInfo 的方法实现 IPerson 的接口
	}
	virtual std::string birthDate() const{
		return PersonInfo::theBirthDate();
	}
private:
	const char *valueDelimOpen() const {return "";} //又一次定义继承而来的 virtual "界限函数"
	const char *valueDelimClose() const {return "";}
}


DatabaseID askUserForDatabaseID();


DatabaseID id(askUserForDatabaseID());
std::tr1::shared_ptr<IPerson> pp(makePerson(id));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118404.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kindle推送服务_kindle推送服务

    kindle推送服务_kindle推送服务微信是个好东西,信息量超大,正能量的东西居多,但信息过载的滋味也很不好受,浏览了一大堆铺天盖地的信息后,关上手机后大脑又重新回到空白。所以还是喜欢用RSS聚合功能,自己去订阅优秀的博客或新闻,当有更新

    2022年8月2日
    5
  • sql2012数据库可疑如何修复_sql数据库mdf还原

    sql2012数据库可疑如何修复_sql数据库mdf还原USEMASTERGOSP_CONFIGURE’ALLOWUPDATES’,1RECONFIGUREWITHOVERRIDEGOALTERDATABASEworkerSETEMERGENCYGOsp_dboption’worker’,’singleuser’,’true’GODBCCCHECKDB(‘worker’,’REPAIR_AL

    2022年8月21日
    6
  • javah 详解_java entity

    javah 详解_java entity1javah–help帮助说明乱码说明javah–help输出内容采用的是utf-8编码,在cmd打开可能出现乱码,因此执行指令chcp936,指定编码字符集(cmd默认的字符编码集是GBK)2javah参数说明javah–help用法:javah[options]<classes>其中,…

    2022年9月15日
    2
  • oracle删除锁表_oracle清理数据文件

    oracle删除锁表_oracle清理数据文件查看Oracle数据库被锁住的表,删除锁表的进程–1.查看被锁住的表SELECTdob.object_nametable_name,lo.locked_mode,lo.session_id,vss.serial#,vss.actionaction,vss.osuserosuser,vss.logon_time,vss.processap_pid,

    2022年8月23日
    6
  • 制作简单的贺卡_bootfs和rootfs

    制作简单的贺卡_bootfs和rootfs分析简单的根文件系统中所必须的文件1.1在嵌入式系统中的根文件系统与桌面版的根文件系统文件基本上类似,所以用Ubuntu中根文件系统问模板,进行分析:1.1.1、bin sbin  linuxrc  是必须的,但是这三个目录以及里面的文件都是移植busybox并安装的时候由busybox生成的1.1.2、etc  是很关键很重要的一个。目录中的文件都是运行时配置文件,都是直接…

    2022年10月6日
    0
  • 计算机启动显示安装程序正在启动服务,安装程序正在启动服务需要多久

    计算机启动显示安装程序正在启动服务,安装程序正在启动服务需要多久大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。安装程序正在启动服务需要多久,这个主要看软件大小,安装完成就会自动运行的,要是系统不断的提示,这个就不一定了,时间可能会很久的,需要耐心等待。程序,香港和台湾对英文procedure的中文翻译,编程语言中的procedure在大陆翻译为“过程”,在港台和其他领域则翻译为“程序”。在大陆于计算机科学、电脑工程、电子工程、电机工程、机…

    2022年6月29日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号