effective C++笔记之条款39: 避免“向下转换”继承层次
来源:互联网 发布:彩虹频道网络电视 编辑:程序博客网 时间:2024/06/04 23:32
- 先看如下例子:
class Person {…};class BankAccount{public: BankAccount(const Person *primaryOwner, const Person *jointOwner); virtual ~BankAccount(); virtual void makeDeposit(double amount)= 0; virtual void makeWithdrawal(doubleamount) = 0; virtual double balance() const = 0; …};class SavingsAccount : public BankAccount{public: SavingsAccount(constPerson *primaryOwner, const Person *jointOwner); ~SavingsAccount(); void creditInterest(); //给账户增加利息 … };
假设为所有账户维持一个列表,通过list类模板实现。
list<BankAccount*>allAccount; //银行中所有账户
现在准备写一段代码来遍历所有账户,为每个账户计算利息。如下所示代码:
for(list<BankAccount*>::iterator p = allAccount.begin(); p != allAccounts.end();++p)
(*p)->creditInterest(); //错误
因为creditInterest只是为SavingsAccount对象声明的,而不是BankAccount。
- 向下转换:从一个基类指针到一个派生类指针。向下转换了继承的层次结构。
- 通过向下转换可以得到通过编译,并正常运行。(static_cast<SavingsAccount *>(*p)->creditInterest();)但是对以后的扩充类难以维护。向下转换难看、容易导致错误,而且使得代码难于理解、升级和维护。
- 向下转换可以通过如下两种方法消除:
- 最好的方法是将这种转换用虚函数调用来代替,同时,它可能对有些类不适用,所以要使这些类的每个虚函数成为一个空操作。
- 加强类型约束,使得指针的声明类型和你所知道的真的指针类型之间没有出入。
- 当不得不进行向下转换时,可以采用比原始转换更好的办法。这种方法称为“安全的向下转换”,通过dynamic_cast运算符来实现。当对一个指针使用dynamic_cast时,先尝试转换,如果成功(即指针的动态类型和正被转换的类型一致),就返回新类型的合法指针;如果dynamic_cast失败,返回空指针。
- effective C++笔记之条款39: 避免“向下转换”继承层次
- effective c++ 条款39: 避免 "向下转换" 继承层次
- 条款 39: 避免"向下转换" 继承层次
- 避免 "向下转换" 继承层次
- dynamic_cast 与 避免 "向下转换" 继承层次
- 《Effective C++》学习笔记条款33 避免遮掩继承而来的名称
- Effective C++:条款33:避免遮掩继承而来的名称
- 读书笔记《Effective C++》条款33:避免遮掩继承而来的名称
- 《Effective C++》学习笔记条款28 避免返回handls指向对象内部成分
- effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const
- effective C++笔记之条款29: 避免返回内部数据的句柄
- effective C++笔记之条款41、42: 区分继承和模板、明智地使用私有继承
- 《Effective C++》:条款38-条款39
- 《Effective C++ 》学习笔记-第六章 条款33:避免遮掩继承而来的名称 Avoid hiding inherited names
- 《Effective C++》学习笔记——条款39
- 《Effective C++》学习笔记条款32 确定你的public继承塑模出is-a关系
- Effective C++:条款9: 避免隐藏标准形式的new
- [effective c++]条款34-区分接口继承和实现继承
- 查询效率调优
- 求ax^2+bx+c=0的根
- Store Kit Guide(In App Purchase)翻译 已完结
- java基础视频25days(毕老师)学习日志(day14、day15、day16)
- 如何写日志
- effective C++笔记之条款39: 避免“向下转换”继承层次
- JSP页面中的pageEncoding和contentType两种属性的区别
- redis配置文件redis.conf
- 生成数据库随机序列号
- 编译和安装BusyBox到Android手机
- 设计模式
- CIO并没有因为云安全的问题而烦恼
- windows apache php5.3.0 xcache
- 木马清道夫破解版