博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条款39: 避免 "向下转换" 继承层次
阅读量:4550 次
发布时间:2019-06-08

本文共 735 字,大约阅读时间需要 2 分钟。

基类指针不能调用派生类的独有的成员,即使基类指针指向派生类对象,因为编译器是根据指针的静态类型来确定调用对象在内存中占据的空间的。此时可以使用static_cast来转换,但不要这么做,因为向下转换难看、容易导致错误,而且使得代码难于理解、升级和维护,static_cast不会进行类型检查,即使指针指向的对象的类型与转换的目标类型不一样,比如说指针指向基类对象,转换为派生类对象,此时仍然会继续转换,当运行时若该指针尝试调用派生类独有成员会出错。

"向下转换" 可以通过几种方法来消除。最好的方法是将这种转换用虚函数调用来代替(程序运行时根据指针的动态类型来调用对应的函数),同时,它可能对有些类不适用(多个派生类,有的派生类需要该函数,有的派生类不需要,此时让其继承基类的虚函数而不覆盖),所以要使这些类的每个虚函数成为一个空操作。第二个方法是加强类型约束,使得指针的声明类型(静态类型)和你所知道的真的指针类型(动态类型)之间没有出入。

但是,有的情况下不得不执行向下类型转换:基类指针调用派生类成员,该成员是派生类独有的,且不能修改类的定义,使得该函数成为基类的虚函数。

此时有比上面那种原始转换更好的办法。这种方法称为 "安全的向下转换",它通过C++的dynamic_cast运算符(参见条款M2)来实现。当对一个指针使用dynamic_cast时,先尝试转换,如果成功(即,指针的动态类型(见条款38)和正被转换的类型一致),就返回新类型的合法指针;如果dynamic_cast失败,返回空指针,vs2013中会编译出错

转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3926993.html

你可能感兴趣的文章
负载均衡下的资源文件配置/多站点下的资源文件夹共享(Windows IIS)
查看>>
MySQL firstmatch strategy
查看>>
MS SQL server 2014 创建用户及权限
查看>>
office很抱歉遇到一些临时服务器问题
查看>>
禁止键盘上的刷新键F5等
查看>>
SAP中对于获取订单的状态
查看>>
oracle PL/SQL块
查看>>
CentOS7集群环境Elastic配置
查看>>
【EXCEL】指定の項目の内容一覧を表示
查看>>
Head first java chapter 4 对象的行为
查看>>
luogu_4503【题解】企鹅QQ 哈希
查看>>
linux 面试
查看>>
Linux:Gentoo系统的安装笔记(三)
查看>>
打开IE窗口并最大化显示
查看>>
Windows API SendMessage 和 PostMessage 内部实现
查看>>
服务器发送邮件出现Could not connect to SMTP host错误 解决办法
查看>>
sklearn.preprocessing.LabelBinarizer
查看>>
C teaching
查看>>
分隔指定内容,提取章节数
查看>>
this point
查看>>