本文为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. BZOJ 1022 小约翰的游戏 (Anti-Nim游戏)

    题解:注意题目中规定取到最后一粒石子的人算输,所以是Anti-Nim游戏,胜负判断为: 先手必胜: 1.所有堆的石子数都为1且游戏的SG值为0: 2.有些堆的石子数大于1且游戏的SG值不为0. #in ...

  2. 转载Spring IntrospectorCleanupListener

    "在服务器运行过程中,Spring不停的运行的计划任务和OpenSessionInViewFilter,使得Tomcat反复加载对象而产生框架并用时可能产生的内存泄漏,则使用Introspe ...

  3. Android_Dialog_设置Dialog窗体的大小

    /** * 设置Dialog窗体的大小 */ private void setWindowSize() { DisplayMetrics dm = new DisplayMetrics(); Wind ...

  4. EGL接口 简单介绍

    from http://lyodev.appspot.com 第二章 EGL 接口 EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口.本章主要讲述 OpenGL ES 的 ...

  5. 编写可维护的JavaScript—语句和表达式&变量、函数和运算符

    语句和表达式 所有的块语句都应当使用花括号.包括: if for while do…while… try…catch…finally //不好的写法 if (condition) doSomethin ...

  6. 实现JQuery_Accordion功能

    1. 添加AJAX引用 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/li ...

  7. 如何在macox下面配置集成ios和android游戏教程

    教程截图: 1.准备工作,配置开发环境: 开发环境:mac ox 10.7.3  +   xcode4.2  + ndk r7 + eclipse helios 部署环境:中兴v880  root过了 ...

  8. 「Foundation」结构体

    一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框架中的数据类型,那么包含它的主头文 ...

  9. apache基本配置

    apache基本配置               apache本地虚拟域名配置  

  10. 3,C语言文件读写

    这两天看到一个关于文件读写的题目,索性就把相关内容总结下. C语言文件读写,无非是几个读写函数的应用,fopen(),fread(),fwrite()等,下面简单介绍下. 一.fopen() 函数原型 ...