日期:2011-03-22 13:55:00 来源:本站整理
C++对象筹划及多态实现之动态和强迫转换[VC/C++编程]
本文“C++对象筹划及多态实现之动态和强迫转换[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为了考证前面提到过的范例动态转换(即dynamic_cast转换),以及对象范例的强迫转换.我们操纵前面定义的C041、C042及C082类来举行考证.
运行下列代码:
c082.C041::c_ = 0x05;
PRINT_VTABLE_ITEM(c041, 0, 0)
PRINT_DETAIL(C041, ((C041)c082))
PRINT_VTABLE_ITEM(((C041)c082), 0, 0)
PRINT_VTABLE_ITEM(c082, 5, 0)
C042 * pt = dynamic_cast<C042*>(&c082);
PRINT_VTABLE_ITEM(*pt, 0, 0)
第2行和第5行是为了对比便利而打印原对象中的信息.第3、4行把C082对象范例举行强迫转换并辨别打印转换后的对象内存信息及虚表信息.第6行我们用dynamic_cast举行了一次动态范例转换,从子类的指针转型为右父类的指针,再把指针指向的对象的信息打印出来.
后果为:
c041 : objadr:0012FA74 vpadr:0012FA74 vtadr:0045B364 vtival(0):0041DF1E
The detail of C041 is 64 b3 45 00 05
((C041)c082) : objadr:0012F2A3 vpadr:0012F2A3 vtadr:0045B364 vtival(0):0041DF1E
c082 : objadr:0012FA50 vpadr:0012FA55 vtadr:0045B36C vtival(0):0041D483
*pt : objadr:0012FA55 vpadr:0012FA55 vtadr:0045B36C vtival(0):0041D483
首先我们对比最后两行,从objadr列我们可以知道pt指向的并非c082对象的起始地址,而是指向了c082的第2个虚表指针的所在地址(因为最后一行的objadr值等于倒数第2行的vpadr的值).倒数第二行的vpadr值是c082对象的第2个虚表指针(我们在输出时指定了偏移值5).而这个地址恰是c082对象中属于从C042类担当而来的部份,即在举行动态范例转换时,除了改变范例信息,编译器还调整了指针的位置,以确保转换语义的精确性.所以我们可以知道,对指向有复杂担当构造的类对象的指针举行范例转换(普通在担当树中向上或向下转换)时,必须利用dynamic_cast,它会精确的处理指针位置的调整,假如转换是不法的,它会返回一个NULL指针.利用dynamic_cast时记得要做这个查抄,文中为了简单把这些查抄省去了.这种查抄可以通过宏来定义,以便于在release版中去掉,提高效率.
以上是“C++对象筹划及多态实现之动态和强迫转换[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论