本文为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));

Effective C++ Item 40 明智而审慎地使用多重继承的更多相关文章

  1. 读书笔记 effective C++ Item 40 明智而谨慎的使用多继承

    1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营.一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好.另外一个阵营则争辩道单继承诚然是好的,但多继承太 ...

  2. Effective C++ -----条款40:明智而审慎地使用多重继承

    多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...

  3. 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承

    1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用 ...

  4. Effective JavaScript Item 40 避免继承标准类型

    本系列作为Effective JavaScript的读书笔记. ECMAScript标准库不大.可是提供了一些重要的类型如Array,Function和Date.在一些场合下.你或许会考虑继承当中的某 ...

  5. 条款40:明智而审慎地使用多重继承(use multiple inheritance judiciously)

    NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base ...

  6. 读书笔记_Effective_C++_条款四十:明智而审慎地使用多重继承

    多重继承是一种比较复杂的继承关系,它意味着如果用户想要使用这个类,那么就要对它的父类也了如指掌,所以在项目中会带来可读性的问题,一般我们都会尽量选择用单继承去替代它. 使用多重继承过程容易碰到的问题就 ...

  7. [EffectiveC++]item40:明智而审慎地使用多重继承

  8. Effective Java 第三版——52. 明智而审慎地使用重载

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  9. Effective Java 第三版——53. 明智而审慎地使用可变参数

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

随机推荐

  1. 权限控制框架Spring Security 和Shiro 的总结

    关于权限控制,一开始感觉比较难,后来先是接触了Spring Security 学起来也比较吃力,再是学习了Shiro,感觉简单很多. 总体来说这些框架,主要做了两个事情 Authentication: ...

  2. windows XP 安装pip

    1.首先安装Python 2.添加环境变量 我的是 path = C:\Python27 3.下载setuptools 这里可参考这篇博文,附带资源的:http://blog.csdn.net/sud ...

  3. linux 中多线程使用

    /* * 对于线程之间的操作: * 一个进程中会有多个线程,各个线程之间的或向切换会付出很小的代价相比于进程之间的切换 * 为什么要引入多线程: * 1.与进程相比,他是一种非常节俭的多任务的操作方式 ...

  4. html5 中的SVG 和canvas

    想到昨天看资料的时候,发现html5 中的SVG 和canvas 都可以表示图形,那它们到底有哪些区别呢?该如何正确的使用它们呢? 1.SVG:可缩放矢量图形,(Scalable Vector Gra ...

  5. 移动Web开发小技巧

    移动Web开发小技巧 添加到主屏后的标题(IOS) name="apple-mobile-web-app-title" content="标题"> 启用  ...

  6. STL之map和multimap(关联容器)

    map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.自动建立Key - value的对应,对于迭代器来说,可以修改实值,而不能修改key. ...

  7. RPC框架——简单高效hessian的使用方式

    RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成“cl ...

  8. ios 面试题 经典(比较全) 根据重点总结

    史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...

  9. jQuery的扩展

    我们自己通过扩展jQuery来达到 “通过$.xx(paras)的形式来进行调用某个jQuery对象的xx(paras)方法”. 下面就是一个实例: (function(j){//这里的j是一个形参, ...

  10. Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”

    为什么需要线程 假设需要开发一个联网应用程序,需要从一个网址抓取网页内容,这里读取的网页地址是笔者在本地机器上自己建立的服务器地址.当然在读取网页内容的时候,可以使用HttpClient提供的API, ...