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));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Windows Server 2012 R2/2016 此工作站和主域间的信任关系失败[通俗易懂]

    Windows Server 2012 R2/2016 此工作站和主域间的信任关系失败[通俗易懂]今天给客户Exchange服务器出现了脱域的情况,当使用域帐户登录时出现了“此工作站和主域间的信任关系失败”的情况。造成这种的可能原因:域内存在了多台SID一样的计算机;计算机对象在AD中意外删除;客户端的帐户密码更新失败;时间超过5分钟;AD复制问题等等;计算机登录现象:解决方法:首先确认在ActiveDirectory的ComputersOU(其他OU也可以)中存在该计算机对象;使用服务器的本地管理员(.\administrator)登录计算机;使用本地管理…

    2022年10月19日
  • 深挖洞广积粮不称霸_threadlocal源码

    深挖洞广积粮不称霸_threadlocal源码ThreadLocal是什么早在JDK1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它

  • Android adb 命令大全「建议收藏」

    Android adb 命令大全「建议收藏」转自:https://github.com/mzlogin/awesome-adbADB,即AndroidDebugBridge,它是Android开发/测试人员不可替代的强大工具,也是Android设备玩家的好玩具。持续更新中,欢迎提PR和Issue补充指正,觉得有用的可以将此GitHub仓库Star收藏备用。注:有部分命令的支持情况可能与Android…

  • 五种MATLAB画圆方式程序「建议收藏」

    五种MATLAB画圆方式程序「建议收藏」clear,clc%方法一:使用隐函数的方法来绘制.holdonezplot(‘x^2+y^2-8′)%方法二:转换成参数函数来绘制图形.symsxytx=2*sin(t);y=2*cos(t);%程序如下:t=0:pi/100:2*pi;x=2*sin(t);y=2*cos(t);plot(x,y,’r’)%方法三:转换成匿名函数来绘制图形.t1=0:pi/100:2*pi;x1=@(tt)2*sin(tt)+1;y1=@(tt)2*cos(tt)+2;..

  • Flume+Kafka整合案例实现

    Flume+Kafka整合案例实现 一、为什么要集成Flume和Kafka我们很多人在在使用Flume和kafka时,都会问一句为什么要将Flume和Kafka集成?那首先就应该明白业务需求,一般使用Flume+Kafka架构都是希望完成实时流式的日志处理,后面再连接上Flink/Storm/SparkStreaming等流式实时处理技术,从而完成日志实时解析的目标。第一、如果Flume直接对接实时计算框架,当数据采集速…

  • 喉头梗阻的常见原因有哪六项_晕针的原因症状处理及预防

    喉头梗阻的常见原因有哪六项_晕针的原因症状处理及预防点击上方”IT牧场”,选择”设为星标”技术干货每日送达!每一个JVM线程都拥有一个私有的JVM线程栈,用于存放当前线程的JVM栈帧(包括被调用函数的参数、局部…

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

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