C++编程思想——运行时类型识别
来源:互联网 发布:apache网站服务器架设 编辑:程序博客网 时间:2024/06/12 01:28
运行时类型识别
C++中有两种方法可以识别当前运行的类型信息
1、dynamic_cast,记得我们之前多态提及向上类型转换,试图用基类来调用子类的方法,当然了需要虚函数的辅助,其实类型的信息正是虚函数的第一个slot中的内容。使用该关键字实现的称为向下类型转换。
class Security{public:virtual ~Security(){}};class Stock:public Security{};class Bond:public Security{};class Investment:public Security{public:void special(){std::cout<<"special Investment function"<<std::endl;}};class Metal:public Investment{};
int main(){vector<Security *>portfolio;portfolio.push_back(new Metal);portfolio.push_back(new Investment);portfolio.push_back(new Bond);portfolio.push_back(new Stock);for (vector<Security *>::iterator it=portfolio.begin();it!=portfolio.end();++it){Investment * cm=dynamic_cast<Investment *>(*it);if (cm){cm->special();}elsecout<<"not a Investment"<<endl;}cout<<"cast from intermediate pointer"<<endl;Security * sp=new Metal;Investment * cp=dynamic_cast<Investment * >(sp);if (cp){cout<<"it is an investment"<<endl;}Metal *mp=dynamic_cast<Metal*>(sp);if (mp){cout<<"it is a Metal too"<<endl;}}
运行结果:
从结果中我们可以发现dymatic_cast能够在多层的继承结构中将类型转换到中间类型。
2、typeid操作符
该操作符返回一个type_info常量对象的引用。当没有虚函数的时候,typeid返回基类地址。Dymatic_cast的开销比typeid大。如果p为指针,type(*p)返回的是派生类类型,typeid(p)返回基类类型。r 为引用类型,typeid(p)为派生类的,typeid(&p)为基类类型。
3、RTTI在编译时和运行时都会产生开销。取得指向虚函数表指针,得到type_info指针,产生一个对type_info结构的引用,双指针的解析。还要判断其基类。构造函数等,但是RTTI引入使得在加入新类型时,必须确定新加入的类型不会导致问题,因此这样的不确定性等都应该慎用这个技术。
4、不能对void指针进行映射,它就是无类型信息的。
0 0
- C++编程思想——运行时类型识别
- C++笔记——c++编程思想(下)通用算法和运行时类型识别
- C++编程思想(卷二):运行时类型识别(RTTI)
- C++编程思想,第十八章《RTTI运行时类型识别》
- C++_Primer_chapter18 2. 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- 运行时类型识别
- C++运行时类型识别——RTTI
- 40.java编程思想——运行期类型鉴定需要
- 41.java编程思想——运行期类型鉴定语法
- 运行时类型识别(RTTI)
- 数组-06. 找出不是两个数组共有的元素(20)
- android命令行方式启动模拟器
- 从MVC框架看MVC架构的设计
- GCD介绍
- sqlite3使用
- C++编程思想——运行时类型识别
- File io流创建文件
- JAVA容器之List
- other
- 计算机是如何工作之简单的程序分析
- android中IntentService和Service有什么区别
- BZOJ 2938 Poi2000 病毒 AC自动机+拓扑排序
- Java学习之线程总结
- SVN 命令