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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bass reducer什么意思_map filter foreach区别

    bass reducer什么意思_map filter foreach区别对于一些环境变量的配置文件,如想使更改后立即生效,多用souce+file执行后即可。如/etc/profile里加了配置,source和bash的区别:sourcefilenam

    2022年8月5日
    5
  • mysql语句和sql语句的区别_mongodb和mysql的区别

    mysql语句和sql语句的区别_mongodb和mysql的区别MySQL和SQL之间的区别有哪些?很多PHP的初学者,对MySQL,MyAdmin和SQL有什么区别并不是很清楚?下面php中文网就带领大家来学习一下MySQL和SQL之间的区别。【推荐阅读:MySQL什么意思】一:什么是SQLSQL是一种数据库语言,可以定义和操作数据库。SQL由ISO(国际标准化组织)标准化,和其他数据库中几乎是相同的方式运行,SQL大致分为三种语言。它在控制和操作数据库时使…

    2022年9月28日
    2
  • apache struts2漏洞 但是系统没有用_tomcat ajp漏洞

    apache struts2漏洞 但是系统没有用_tomcat ajp漏洞0x00前言ApacheStruts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级JavaWeb应用的开源MVC框架,主要提供两个版本框架产品:Struts1和Struts2。Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Contro

    2022年9月14日
    3
  • [套图]关于爱情_恋爱图

    [套图]关于爱情_恋爱图 .com  分享最最可爱的互联网 喜欢这套图,看起来很温和   ByEasy

    2022年9月14日
    1
  • iOS layoutSubviews 调用[通俗易懂]

    iOS layoutSubviews 调用[通俗易懂]在初始化时,使用init和-(instancetype)initWithFrame:(CGRect)frame,但是,在调用时是有系统区分的,iOS11.0以下,调用init和-(instancetype)initWithFrame:(CGRect)frame当frame为CGRectZero是不会调用的, 在调用addSubView时,这个跟添加的subView尺寸大小没有关系。 改变…

    2022年7月15日
    13
  • BigDecimal 与 int,long,double之间的互转[通俗易懂]

    BigDecimal 与 int,long,double之间的互转[通俗易懂]BigDecimal与int,long,double之间的互转转换关系如下:int转换成BigDecimal/***int转Bigdecimal*/@Testpublicvoiddemo04(){inta=101;BigDecimalbig=newBigDecimal(a);System.out.prin…

    2022年5月26日
    61

发表回复

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

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