/*======================================================================
RTTI: Run Time Type Identification
typied<--->dynamic_cast
对于一个纯虚函数被两个不同的类继承 这两个类有单独的成员函数
void dosomething(Flyable *obj)
{
//判断obj的运行类型
cout<<typeid(*obj).name()<<endl;
obj->takeoff();
obj->land();
//调用不同的成员函数
if(typeid(*obj)==typeid(Bird)
{
Bird *bird=dynamic_cast<Bird*>(obj);//强制类型转换
目标类型 源类型
………………
}
}
//注意的地方
dynamic_cast:
1、只能用于指针和引用的转换
2、要转换的类型中必须包含虚函数 没有虚函数就转换失败
3、如果转换成功转为子类指针 转换失败返回NULL
typeid返回type_info对象的引用
如果想通过基类指针获得派生类的数据类型,基类必须带有虚函数
对于typeid只能获取当前对象是基类还是子类 不能获取对象指针是基类还是子类
/*======================================================================*/
#include<iostream>
using namespace std;
class A
{
public:
A() {}
virtual ~A() {}
virtual void test() = 0;
};
class B:public A
{
public:
B() {}
virtual ~B() {}
void BB()
{
cout << "B特有的函数" << endl;
}
virtual void test()
{
cout << "类B的test" << endl;
}
};
class C:public A,public B
{
public:
C() {}
virtual ~C() {}
void CC()
{
cout << "C特有的函数" << endl;
}
virtual void test()
{
cout << "类C的test" << endl;
}
};
void Test(A *p)
{
if (typeid(*p).name() == typeid(B).name())
{
//类型强制转换
B *b=dynamic_cast<B*>(p);
b->test();
b->BB();
}
if (typeid(*p).name() == typeid(C).name())
{
//类型强制转换
C *c = dynamic_cast<C*>(p);
c->test();
c->CC();
}
}
int main()
{
A *a1 = new B();
Test(a1);
A *a2 = new C();
Test(a2);
delete a1,a2;
a1 = NULL;
a2 = NULL;
return 0;
}
C++中的Run Time Type Identification
最新推荐文章于 2021-05-29 20:59:31 发布