通过运行时类型识别(RTTI), 我们能够使用基类的指针或引用来判定这些指针或引用实际指向对象的类型。这要求基类中至少要有一个虚函数。
判定的方法包括dynamic_cast和typeid:
1、 dynamic_cast 动态转化
它的格式为:dynamic_cast<T*>(basestr) 或 dynamic<T&>(basetype)
basestr必须是0( 此时返回0)或指向对象的指针,如果basestr不是T类型的指针,则dynamic_cast结果为0,如果basetype不是T类型引用,则抛出异常。
2、 typeid使用
typeid(e) e是表达式类型名,如果e是含有虚函数的类型的指针或引用,则会对应其动态类型,否则对应静态类型。
下面是实例代码:
Code
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
virtual ~A() {};
int ta;
};
class B: public A
{
int tb;
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a;
a = new B;
if(B* b = dynamic_cast<B*>(a))
{
cout<<"a是B类型指针"<<endl;
}
else
{
cout<<"a不是B类型指针"<<endl;
}
A a1;
B b1,b2;
A& ra1 = b1;
A& ra2 = a1;
A& ra3 = b2;
try
{
B& b = dynamic_cast<B&>(b1);
cout<<"b1是B类型引用"<<endl;
}
catch(bad_cast)
{
cout<<"b1不是B类型引用,发生异常"<<endl;
}
try
{
B& b = dynamic_cast<B&>(a1);
cout<<"a1是B类型引用"<<endl;
}
catch(bad_cast)
{
cout<<"a1不是B类型引用,发生异常"<<endl;
}
int i;
cout<<(typeid(i)==typeid(int))<<endl;//输出为1,及i是整数类型,这是静态类型
cout<<(typeid(a1)==typeid(b1))<<endl;//输出0,静态类型比较
cout<<(typeid(ra1)==typeid(ra2))<<endl;
cout<<(typeid(ra1)==typeid(ra3))<<endl;//动态类型,引用都指向了B
cout<<(typeid(ra1)==typeid(B))<<endl;//输出为1
}