我是靠谱客的博主 忧心含羞草,最近开发中收集的这篇文章主要介绍三十三、RTTI(runtime type information)、dynamic_cast运算符、typeid运算符、type_info,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、RTTI(runtime type information)
          RTTI(Run-Time Type Information)运行时类型检查的英文缩写,它提供了运行时确定对象类型的方法。面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持。这里研究一下C++是如何使用RTTI的。
二、dynamic_cast运算符
          使用dynamic_cast有两个限制,首先编译器支持dynamic_cast选项,并且应用在具有多态关系的继承体系中(基类有虚函数)。在向下转型的过程中,dynamic_cast自动完成对齐操作。
三、typeid运算符
         typeid是一个返回指针或引用所指对象的实际类型的操作符。如果操作数不是类类型或者是没有虚函数的类,则获取其静态类型;如果操作数是定义了虚函数的类类型,则计算运行时类型。下面是typeid的注意事项:
  • type_info类的实现因编译器的不同而不同。但如下几个常用的操作符和函数是c++标准要求必须实现的:“t1 == t2”、“t1 != t2”、“t.name()”。
  • typeid操作符的返回类型就是type_info,正因为type_info提供了“==”操作符,才可以进行上面提到的“if (typeid(*bp) == typeid(*dp))”判断。
  • type_info的默认构造函数、拷贝构造函数、赋值操作符都定义为private,创建type_info对象的唯一方法就是使用typeid操作符。

最后我们来看一个示例:
#include <iostream>
using namespace std;
class Shape
{
public:
virtual void Draw() = 0;
virtual ~Shape() {}
};
class Circle : public Shape
{
public:
void Draw()
{
cout<<"Circle Draw ..."<<endl;
}
};
class Square : public Shape
{
public:
void Draw()
{
cout<<"Square Draw ..."<<endl;
}
};
int main(void)
{
Shape* p;
Circle c;
p = &c;
p->Draw();
if (dynamic_cast<Circle*>(p))
{
cout<<"p is point to a Circle object"<<endl;
Circle* cp = dynamic_cast<Circle*>(p);
// 安全向下转型
cp->Draw();
}
else if (dynamic_cast<Square*>(p))
{
cout<<"p is point to a Square object"<<endl;
}
else
{
cout<<"p is point to a Other object"<<endl;
}
cout<<"typeid(*p).name():"<<typeid(*p).name()<<endl;
cout<<"typeid(Circle).name():"<<typeid(Circle).name()<<endl;
if (typeid(Circle).name() == typeid(*p).name())
{
cout<<"p is point to a Circle object"<<endl;
((Circle*)p)->Draw();
}
else if (typeid(Square).name() == typeid(*p).name())
{
cout<<"p is point to a Circle object"<<endl;
((Square*)p)->Draw();
}
else
{
cout<<"p is point to a Other object"<<endl;
}
return 0;
}
打印结果:


最后

以上就是忧心含羞草为你收集整理的三十三、RTTI(runtime type information)、dynamic_cast运算符、typeid运算符、type_info的全部内容,希望文章能够帮你解决三十三、RTTI(runtime type information)、dynamic_cast运算符、typeid运算符、type_info所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部