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)
上一篇 2021年12月6日 下午5:00
下一篇 2021年12月6日 下午5:00


相关推荐

  • pycharm搜索不到安装包

    pycharm搜索不到安装包使用 pycharm 的时候在 setting 里安装包发现搜索不到 点下面的 managereposi 添加源也没有用 如图 最后发现是这一步里把那个绿色的圆圈点一下就 ok 了 即把 condapakagem 关掉 注意是关了不是打开 然后就发现可以搜到包了 解决

    2026年3月17日
    2
  • cudnn和cuda的关系_nvidia驱动,cuda与cudnn的关系

    cudnn和cuda的关系_nvidia驱动,cuda与cudnn的关系1 NVIDIA 的显卡驱动程序和 CUDA 关系 NVIDIA 的显卡驱动程序和 CUDA 完全是两个不同的概念哦 1 1 CUDACUDA 是 NVIDIA 推出的用于自家 GPU 的并行计算框架 也就是说 CUDA 只能在 NVIDIA 的 GPU 上运行 只有当要解决的计算问题是可以大量并行计算的时候才能发挥 CUDA 的作用 CUDA 的本质是一个工具包 ToolKit 但是二者是不一样的 1 2 NVIDIA 的显卡驱动程序

    2026年3月16日
    2
  • linux抓本来端口包,Linux抓包

    linux抓本来端口包,Linux抓包tcpdump-ieth1-nn‘dsthost172.31.0.42‘-w/tmp/temp.cap监听指定的主机$tcpdump-ieth0-nn‘host192.168.1.231‘这样的话,192.168.1.231这台主机接收到的包和发送的包都会被抓取。$tcpdump-ieth0-nn‘srchost192.168.1.231‘这样只有192….

    2022年10月15日
    3
  • css居中的几种办法,CSS div居中的几种方法

    css居中的几种办法,CSS div居中的几种方法CSS 实现 div 垂直居中的方法有很多 下面 div 居中的几种方法是自己平时写网页中经常用到的 最常见的例子就是登录注册弹出框 方法一 对 div 使用绝对布局 position absolute 并设置 top left right bottom 的值相等 但不一定都等于 0 并且设置 margin auto div 水平垂直都居中方法二 这个方法要知道 div 的宽度和高度 对 div 使用绝对布局 position ab

    2026年3月17日
    1
  • python suds_在python3.x上安装suds 并访问webservice「建议收藏」

    python suds_在python3.x上安装suds 并访问webservice「建议收藏」suds。。。py3很乱。。一开始直接使用命令行:pipinstallsuds安装,结果报错ImportError:Nomodulenamedclient,然后就自然的pipinstallclient,然后成功了,pipinstallsuds安装,这下成功安装了。但是在python里虽然能importsuds。。但不能fromsuds.clientimportClien…

    2025年5月31日
    7
  • vue 生成二维码 打印_代码生成二维码

    vue 生成二维码 打印_代码生成二维码npminstallqrcodejs2–save<template><div><divid=”qrCode”ref=”qrCodeDiv”></div></div></template><script>importQRCodefrom’qrcodejs2′;exportdefault{name:”qrCode”,data(){.

    2026年4月14日
    3

发表回复

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

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