快速业务通道

《深度探索C++对象模型》读书笔记(7)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
e of the template instantiation”来决 定name.

// 因为_val的类型是int,而函数的决议只和函数原型有关,与函数返回值无关
// 被用来具现这个template的真正类型对于_val的类型没有影响
_member = foo (_val);

故此处的调用操作由“scope of the template definition”来决议 。

若是如下的函数调用:

sr0.type_dependent();

由于_member的类型与 template参数有关,故此处由“scope of the template instantiation”来决议。

***Member Function的具现行为***

以手动方式在个别的object module中完成预先具现 操作,是唯一有效率的办法。

***执行期类型识别***

dynamic_cast运算符可以在执行期 决定真正的类型。如果downcast是安全的(也就是说,一个base type pointer指向一个derived class object),这个运算符会传回被适当转型过的指针;如果downcast不是安全的,这个运算符会传回 0.

typedef type *ptype;
typedef fct *pfct;

simplify_conv_op (ptype pt)
{
if(pfct pf = dynamic_cast<pfct>(pt)) {
...
}
else { ... }
}

什么是dynamic_cast的真正成本?pfct的一个类型描述器会被编 译器产生出来,由pt指向之class object类型描述器必须在执行期通过vptr取得。下面是可能的转换:

// 取得pt的类型描述器
((type_info*)(pt->vptr[0]))- >_type_description;

其中,type_info是C++ Standard所定义的类型描述器的class 名称,该class中放置着待索求的类型信息。virtual table的第一个slot内含type_info object的地址 ,此type_info object与pt所指之class type有关。

dynamic_cast运算符也适用于reference身 上,然而对于一个non-type-safe-cast,其结果不会与施行于指针的情况一样。一个reference不可以像 指针那样“把自己设为0便代表了no object”;若将一个reference设为0,会引起一个临时 性对象(拥有被参考到的类型)被产生出来,该临时对象的初值为0,这个reference然后被设定为该临 时变量的一个别名。

因而,如果reference并不真正是某一种derived class,那么可通过丢出一 个bad_cast exception进行处理:

simplify_conv_op(const type &rt)
{
try {
fct &rf = dynamic_cast<fct&>(rt);
}
catch(bad cast) {
// ...
}
}

当然,你也可以使用typeid运算符来达到同样的目的:

simplify_conv_op(const type &rt)
{
if(typeid(rt) == typeid (fct))
{
fct &rf = dynamic_cast<fct&>(rt);
}
else { ... }
}

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号