码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 之RTTI

时间:2015-07-08 22:40:48      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:rtti

RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或者引用来检查这些指针或引用所指的对象的实际派生类对象。

RTTI提供了以下两个非常有用的操作符:
(1)typeid操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用,dynamic_cast在转换的过程中必须有虚函数
#include<iostream>
using namespace std;

class A
{
private:
	int num;
};
class B:public A
{
private:
	int num;
};
void main()
{
	A *pa = new A;
	A *pb = new B;
	cout << "*pa: " << typeid(*pa).name()<< "     *pb: "<<typeid(*pb).name() << endl;
	cout << "pa: " << typeid(pa).name ()<< "     pb: " << typeid(pb).name() << endl;

	cin.get();
}
技术分享

可以看出typeid解析出*pa和*pb 都为class A

#include<iostream>
using namespace std;

class A
{
private:
	int num;
	virtual void go()
	{
	}

};
class B:public A
{
private:
	int num;
void go()
	{
	}
};
void main()
{
	A *pa = new A;
	A *pb = new B;
	cout << "*pa: " << typeid(*pa).name()<< "     *pb: "<<typeid(*pb).name() << endl;
	cout << "pa: " << typeid(pa).name ()<< "     pb: " << typeid(pb).name() << endl;

	cin.get();
}

技术分享

从这可以看出,虚函数可以确定数据类型。

#include<iostream>
using namespace std;

class A
{
private:
	int num;
	virtual void go()
	{
	}

};
class B:public A
{
private:
	int num;
void go()
	{
	}
};
void main()
{
	A *pa = new A;
	A *pb = new B;
	B *pb1 = dynamic_cast<B*>(pa);
	B *pb2 = dynamic_cast<B*>(pb);

	if (pb1 == nullptr)
	{
		cout << "pa转换失败" << endl;//由于pa指向的A的对象但是其中并没有B的对象实体,在安全情况下其返回为空。
	}

	if (pb2 == nullptr)
	{
		cout << "pb转换失败" << endl;
	}


	cin.get();
}
技术分享

版权声明:欢迎转载,如有不足之处,恳请斧正。

C++ 之RTTI

标签:rtti

原文地址:http://blog.csdn.net/huangshanchun/article/details/46807535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!