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));
Effective C++ Item 40 明智而审慎地使用多重继承的更多相关文章
- 读书笔记 effective C++ Item 40 明智而谨慎的使用多继承
1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营.一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好.另外一个阵营则争辩道单继承诚然是好的,但多继承太 ...
- Effective C++ -----条款40:明智而审慎地使用多重继承
多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...
- 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承
1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用 ...
- Effective JavaScript Item 40 避免继承标准类型
本系列作为Effective JavaScript的读书笔记. ECMAScript标准库不大.可是提供了一些重要的类型如Array,Function和Date.在一些场合下.你或许会考虑继承当中的某 ...
- 条款40:明智而审慎地使用多重继承(use multiple inheritance judiciously)
NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base ...
- 读书笔记_Effective_C++_条款四十:明智而审慎地使用多重继承
多重继承是一种比较复杂的继承关系,它意味着如果用户想要使用这个类,那么就要对它的父类也了如指掌,所以在项目中会带来可读性的问题,一般我们都会尽量选择用单继承去替代它. 使用多重继承过程容易碰到的问题就 ...
- [EffectiveC++]item40:明智而审慎地使用多重继承
- Effective Java 第三版——52. 明智而审慎地使用重载
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Effective Java 第三版——53. 明智而审慎地使用可变参数
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
随机推荐
- 基于Visual C++2013拆解世界五百强面试题--题3-打印螺旋数组
请用C语言实现 输入N,打印N*N矩阵 比如 N = 3, 打印: 1 2 3 8 9 4 7 6 5 N = 4, 打印 1 2 3 4 12 13 14 5 11 16 ...
- Struts2 学习笔记19 类型转换 Part1
现在来说一说类型转换,提到类型转换其实我们之前早已经用过了,在url传递参数的时候,我们传递过来的参数其实都是String类型的,在显示的时候都自动转换了,像这种简单的转换很好理解,我们要说的是,转换 ...
- ASP.NET 母版页和内容页的加载顺序
Master 模板页Content 内容页如果希望Master页面的数据传给Content页面,请Init如果希望Content页面的数据传给Master页面,请重载Load具体细节不多说了,看下面页 ...
- linker command failed with exit code 1 (use -v to see invocation),经典Xcode编译错误的出现和解决!
linker command failed with exit code 1 (use -v to see invocation)这个肯定是个xcode编译运行的时候经典的报错了. 这个问题曾经在我的 ...
- Unqualified name lookup
Unqualified name lookup File scope Namespace scope For an qualified name, that is a name that does n ...
- [Git]自译《Git版本控制管理》——1.介绍(二)_Git诞生
译者前言: 本系列译文为作者利用业余时间翻译,有些疏漏与翻译不到位的地方敬请谅解. 不过也很希望各位读者能给出中肯的建议. 方括号的注释,如[1][2]为译者注. ...
- Css静态进度条
图片预览: Css代码: <style> .statusList{width:240px; float:left; line-height:68px;margin:0 2px; text- ...
- C语言新学备忘_1
#include <stdio.h> //C语言的标准输入 ,输出头文件扩展名为.h的文件称为头文件 //include称为文件包含命令 #include <stdlib.h> ...
- QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...
- java线程中的sleep/wait/notify/yield/interrupt方法 整理
java线程中的sleep/wait/notify/yield/interrupt方法 sleep 该方法能够使当前线程休眠一段时间 休眠期间,不释放锁 休眠时间结束之后,进入可执行状态,加入到线程就 ...