C++ 之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();
}


阅读更多
版权声明:欢迎转载,如有不足之处,恳请斧正。 https://blog.csdn.net/huangshanchun/article/details/46807535
文章标签: RTTI
个人分类: C/C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

C++ 之RTTI

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭