书上说"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();
}
}
...全文
205 7 打赏 收藏 转发到动态 举报
写回复
用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信息的,具体实做每个编译器都不一样--比如有的就是用矩阵来获得常数时间的效率
Re:CCNA_CCNP 思科网络认证 PAT NAT 端口或地址转换 与端口映射======================# 本章课程大纲        公网地址和私网地址        NAT应用场景        静态NAT  :static  地址转换        动态NAT  :dynamic地址转换        PAT        :端口地址转换        端口映射 :port map        在Windows上同时实现的NAT和端口映射 # 私网地址三类 A类:10.0.0.0                                255.0.0.0(1网段) B类:172.16.0.0 -172.31.0.0         255.255.0.0(16网段) C类:192.168.0.0-192.168.255.0  255.255.255.0(255网段) # NAT 的使用场景        NAT的最初的目的是允许把私有IP地址映射到公网地址,以减缓IP地址空间的消耗。        当一个组织更换它的互联网服务提供商ISP,但不想更改内网配置方案时,NAT同样很有用途。        以下是适于使用NAT的多种情况:         企业内网接入Internet节省公网地址         单向访问         大方向:内网访问互联网(互联网上主机不能够访问内网主机)         小方向:同单位实现两个网段之间单向访问(涉密部门能够访问其他部门,反之不可)         增加一个网段          避免在主干路由器增加到这个网段的路由         在Windows上实现的NAT和端口映射 # 网络地址转换的类型        下面介绍一下NAT的三种类型。         静态NAT 是为了在私网地址和公网地址间,允许一对一映射而设计的。         或者IPv4和IPv6之间的转换(典型)         不节省公网地址,故公网地址的利用效率不高,         无任何安全性,外网可以通过公网地址直接攻击内网主机,好像只增加路由器的工作         适用场景类似代理,可以较方便的更换主机,而无需修改路由器的配置         故应用不够广泛...         动态NAT 可以实现映射一个未注册 IP地址到注册IP地址池中的一个注册IP地址。         多对一,或多对多         比较PAT优势:避免被误认为攻击而被封ip地址         不太节省地址,应用不广泛         复用是最流行的NAT配置类型,也被称为端口地址映射(PAT)。         通过使用PAT,可实现上千个用户仅通过一个真实的全球 IP地址连接到Internet。         缺点:增加延迟,消耗路由器性能 # 端口映射(port mapping) 允许Internet上的计算机通过企业路由器的公网IP地址访问到内网的服务器------------------------------------------------         

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧