社区
C++ 语言
帖子详情
书上说"dynamic_cast把基类指针转换成派生类指针"
zhuliangsu
2003-10-19 06:54:56
书上说"dynamic_cast把基类指针转换成派生类指针"
void company::payroll(employee *pe)
{
if(programmer *pm=dynamic_cast(pe))
//这里,dynamic_cast怎么知道employee的派生类就是programmer???
//如果employee还有其他的派生类呢??
{
pm->bonus();
}
}
...全文
204
7
打赏
收藏
书上说"dynamic_cast把基类指针转换成派生类指针"
书上说"dynamic_cast把基类指针转换成派生类指针" void company::payroll(employee *pe) { if(programmer *pm=dynamic_cast(pe)) //这里,dynamic_cast怎么知道employee的派生类就是programmer??? //如果employee还有其他的派生类呢?? { pm->bonus(); } }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
eric8231
2003-10-20
打赏
举报
回复
现存的大部分编译器,是在每个多态类对象(比如这里的employee类对象,programmer类对象等等)的虚函数表的某个索引处(比如负索引处)安放一个指针,指向这个对象的RTTI信息。
然后函数dynamic_cast()比较两个RTTI信息,如果相同则说明两个指针所指的对象类型相同。比如 programmer *pm=dynamic_cast(pe);系统分别取来pe和pm所指对象的信息,然后进行比较。
所以作为编译器,在编译过程中,并不真正需要知道pe所指的具体对象类型。编译器关心的只不过是:1. employee是否为多态类型(因为多态类才有虚函数表) 2.programmer是否是employee无歧异的派生类。 编译器在确定这些信息后,便可以有把握地进行这种编译期间无法去定具体类型的转换了。
Flamesong
2003-10-20
打赏
举报
回复
同意yndfcd(YNDFCD)
yndfcd
2003-10-20
打赏
举报
回复
没见过这种写法。
好象应该是programmer* pm = dynamic_cast<programmer*>(pe)吧。
bm1408
2003-10-19
打赏
举报
回复
UP!
Andy84920
2003-10-19
打赏
举报
回复
具体点是:
当使用基类的指针或引用时而不是对象,
编译器会使用指针或引用实际指向的类型来引用成员,而是对象时就是引用自己。
Andy84920
2003-10-19
打赏
举报
回复
是啊,编译器做的事情!
mechgoukiteng
2003-10-19
打赏
举报
回复
这是由编译器完成着的工作
因为程序在编译的时候编译器肯定会保存所有class信息的,具体实做每个编译器都不一样--比如有的就是用矩阵来获得常数时间的效率
由static_
cas
t和
dynamic
_
cas
t到C++对象占用内存的全面分析
static_
cas
t和
dynamic
_
cas
t是C++的类型转换操作符。编译器隐式执行的任何类型转换都可以由static_
cas
t显式完成,即父类和子类之间也可以利用static_
cas
t进行转换。而
dynamic
_
cas
t只能用于类之间的转换。那么
dynamic
_
cas
t的存在还有什么意义呢?因为
dynamic
_
cas
t提供了一个重要的特性:运行时类型检查来保证转换的安全性。 用static_
cas
t转换存在的危险 我们知道,一个
基类
指针
不需要进行明确的转换操作,就可以指向
基类
对象或者
派生类
对象。比如: class Base{ //… }; class Derived{ //…
C++中四种强制类型转换的区别
使用标准C++的类型转换符:static_
cas
t、
dynamic
_
cas
t、reinterpret_
cas
t和const_
cas
t。 1、static_
cas
t 用法:static_
cas
t (expression) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: (1)用于类层次结构中
基类
和
派生类
之间
指针
或引用的转换 进行上行转换(把
派生类
的
指针
或引用
转换成
基类
表示)是安全的 进行下行转换(把
基类
的
指针
或引用转换为
派生类
表示),由于没有动态类型检查,所以是不安全的 (2)用于基
C++ 使用
dynamic
_
cas
t执行
基类
向
派生类
的转换
dynamic
_
cas
t是与static_
cas
t,const_
cas
t,reinterpret_
cas
t并列的4种类型转换操作之一。它可以将
基类
的
指针
显示转换为
派生类
的
指针
,或将
基类
的引用显示转换为
派生类
的引用。但与static_
cas
t不同的是,它执行的不是无条件的转换,它在转换前会检查
指针
(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼容转换才会发生,才能得到
派生类
的
指针
(或引用),否则: 如果执行的是
指针
类型的转换,会得到空
指针
。 如果执行的是引用类型的转换,会抛出异常。 #inc
使用
dynamic
_
cas
t强制将
基类
指针
转换成
子类
指针
在继承关系中,如果需要增加新的接口,又不想在父类中添加虚函数,这时可以在子类中增加新的接口,当使用父类
指针
访问这个函数的时候,需要用
dynamic
_
cas
t进行类型强转,因为父类中本身并没有这个函数,所以要实现最终的调用,就需要对
指针
的实际指向进行类型判断(RTTI) 这种调用函数方式有点类似于多态,但并非是真正的多态,因为它是硬性的将
基类
指针
转换成
子类的
指针
达到访问
派生类
方法的目的,所以实
基类
和
派生类
指针
转换--
dynamic
_
cas
t
1、背景 编程中遇到如下问题:有
基类
指针
pA指向
派生类
B对象,使用该
指针
调用虚函数,执行的是
派生类
中的函数,没问题。不过现在想执行
派生类
中非虚函数,因为该
指针
是
基类
类型的,所以执行的是
基类
中函数或者是返回错误(
基类
中没有此函数)。当然,在这种确定此
基类
指针
指向的是
派生类
对象的情况下,可以将此
基类
指针
强制类型转换为
派生类
指针
:B *pB=(B *)pA。 在查找相关资料时,学到了
基类
和派
C++ 语言
64,637
社区成员
250,559
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章