首先是C++提供的四种转型操作:

1. const_cast:常量性的转除。
2. dynamic_cast:安全的向derived class进行转型,可能会带来很高的开销
3. reinterpret_cast:低级转型,例如可讲pointer转成int,不建议使用
4. static_cast: 强迫隐式转换,例如int to const int,int to double, 但是const int 到 int 只有const_cast能做到。
在我们面前经常出现的一种使用情况是,像下面这样:
 1 class Window{
 2 public:
 3     virtual    void onResize(){...}
 4     ...
 5 };
 6 class SpecialWindow: public Window{
 7 public:
 8     virtual void onResize(){
 9         static_cast<Window>(*this),onResize();
10         ...
11     }
12     ...
13 }

但是实际上上面的副本不能如愿以偿的调用其基类部分的onResize(),其事实上调用的是SpecialWindow的基类部分的副本的的单独的onResize,实际上和SpecialWindow的resize没有什么关系。这时,如果SpecialWindow本身也尝试去修改SpecialWidnow的非基类部分的话,那么对象就会进入一种伤残的状态.其基类部分没有进行必要的修改,但是派生类单独的部分却经历了修改,这样对象就会进入一种伤残的状态.
其实调用基类的Resize的正确方法根本就不需要用到转型操作:

class SpecialWindow:public Window{
public:virtual void onResize(){Window::onResize(){.......}...}
};

再论dynamic_cast,记住一般起调用带来的开销还是比较大的。而一般需要dynamic_cast的主要情况是,只拥有一个base class 指针的情况下,想要对derived class进行单独的处理。一般有两种方式可以替代dynamic_cast达到这种效果.
第一种方法是取一个容器并在里面存储,直接指向derived class对象的指针(往往是智能指针)。
typedef vector<shared_ptr<SpecialWindow>> VPSW;
VPSW windPtrs;
...
for(VPSW::iterator iter = windPtrs.begin(); iter != windPtrs.end(); ++iter){iter->blink();
}

还有一种方法就是,将虚函数从derived class向上再延伸一层,这样,直接使用Base class 的指针,就可以调用derived class的函数。
记住,优秀的代码是很少使用转型操作的,应该尽可能的隔离转型操作。
小结:
1. 如果可以应该尽量减少转型的使用,尤其是dynamc_cast(其会消耗很多的资源)。
2. 如果需要转型,那么至少应该将他隐藏起来,例如放置到某个函数内使用。
3. 如果使用转型,那么一定要使用新式转型。

转载于:https://www.cnblogs.com/-wang-cheng/p/4867321.html

条款27:尽量少做转型动作相关推荐

  1. 【Effection C++】读书笔记 条款27:尽量少做转型动作

    [Effective C++]读书笔记 Part5 实现 条款27:尽量少做转型动作 C++中的类型转换语法 类型转换语法主要有三种不同的形式: (T)expression //将expression ...

  2. Effective C++之条款27:尽量少做转型动作

    声明: 文中内容收集整理自<Effective C++(中文版)第三版>,版权归原书所有. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正. 条款27: ...

  3. 来自PCBA工厂的忠告,这种PCB封装设计请尽量少做

    作者:一博科技高速先生自媒体成员 王辉东 生活需要仪式感,爱情也亦然. PCBA工程部的张阿强,喜欢供应链的美女梅子好多年. 人送外号张爱梅. 关键是梅子对阿强也很有好感. 她喜欢一有空,就偷瞄阿强那 ...

  4. Effective C++之条款27、28

    条款27:尽量少做转型动作 C++规定的设计目标之一是,保证"类型错误"绝不可能发生.这是一个极具价值的保证.C++提供四种新式转型(常常被称为new-style或C+±style ...

  5. java编程时 尽量少用_Java编程语言基础知识的要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.下面就说说Java零基础学习Java编程语言基础知识的几个要点.希望能够对Java编程基础入门学习的新手有帮助 ...

  6. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据

    一致性哈希算法--算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据 参考文章: (1)一致性哈希算法--算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据 (2)http ...

  7. 根据目标选择减肥方法 少做无用功

    不同的美体目标适合的减肥方法也是不同的,有些人想减去大部分体重,而有些人只是想让身体曲线更柔美,这就要求有相应的减肥方法,对症下药,才会让减肥少做无用功. 目标:我想穿上小一码的衣服 建议:适当节食 ...

  8. 使用Ext JS,不要使用页面做组件重用,尽量不要做页面跳转

    2019独角兽企业重金招聘Python工程师标准>>> 使用Ext JS,不要使用页面做组件重用,尽量不要做页面跳转 今天,有人请教我处理办法,问题是: 一个Grid,选择某条记录后 ...

  9. Effective Objective-C 2.0 — 第二条:类的头文件中尽量少引入其他头文件

    第二条:类的头文件中尽量少引入其他头文件 使用向前声明(forward declaring) @class EOCEmployer 1, 将引入头文件的实际尽量延后,只在确有需要时才引入,这样就可以减 ...

最新文章

  1. apache php wordpress,windows 安装 apache php wordpress
  2. Linux线程时间片如何修改,请教如何修改线程时间片
  3. qt连接mysql创建表_Qt编译mysql以及创建表后进行导入操作
  4. SQLServer2008快速清理日志文件
  5. anaconda安装numpy_Python3.8如何安装Numpy
  6. 虚方法和重写方法的继承特性
  7. Hamilton-Caylay (哈密尔顿-凯莱)定理
  8. 老男孩linux高端运维课程—linux系统目录结构知识讲解
  9. java商城源码(servlet,springboot,html,vue,uniapp,小程序,android)一套任意组合
  10. 简单分析minidump
  11. 如何在UltraCompare中编辑文件?
  12. 排列组合问题之捆绑法和插空法
  13. Cesium聚簇实现-kdbush类实现
  14. weixuan -奥利给turtle
  15. 初中数学分几个模块_初中数学主要分几大板块,该注意学习哪个板块?
  16. 优维低代码:第三方接口接入
  17. 小四轴——空心杯电机引起的电源干扰
  18. 华硕K42JC安装显卡驱动后进不了系统解决方法
  19. 计算机图形学课程总结
  20. 凝血酶分子机器人_厉害啊!中科院团队发明世界第一个智能抗癌DNA纳米机器人《星际之门:亚特兰蒂斯》...

热门文章

  1. 在线文本字符串批量替换工具
  2. linux多线程入库hive,hiveserver2 定时挂采坑记
  3. 数学 - 线性代数导论 - #9 Ax=b的解:存在性、解法、解的结构、解的数量
  4. react native快速上手
  5. thinkphp 连接sql server
  6. CSS学习 -- 3种命名方式及规则
  7. 9-14 ruby环境准备 操作
  8. 【论文写作】毕业论文怎么写?写作步骤是什么?
  9. keil5怎么接入汇编_keil中如何让汇编语言生成hex文件
  10. 我用Python把抖音上的美女图片转字符画,期望的AI目标更进一步【机器学习算法实战小项目,k聚类算法图片转化字符画】