通过以下两个操作符提供RTTI:
1.typeid 操作符,返回指针或引用所指对象的实际类型。
2.dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
××这些操作符只为带有一个或多个虚函数的类返回动态类型信息。只有存在虚函数的情况下,编译器才会为类加入多态信息。
与dynamic_cast一起使用的指针必须是有效的--他必须为0或者指向一个对象。
dynamic_cast操作符一次执行两个操作。它首先验证被请求的转换是否有效,然后进行转换。
#include
#define VIRTUAL_METHOD 1
// class A{
// virtual say() {}
// };
// class B: public A{virtual say() {}};
// class C: public A{virtual say() {}};
// class D{virtual say() {}};
// class E : public B, public C, public D{virtual say() {}};
//
// int main(int argc, char* argv[])
// {
// D* e = new D();
// E* d = dynamic_cast(e);
// return 0;
// }
class B {
public:
#ifdef VIRTUAL_METHOD
virtual void f() {}
#endif
};
class C : public B {
public:
#ifdef VIRTUAL_METHOD
virtual void f() {}
#endif
};
class D : public C {
public:
#ifdef VIRTUAL_METHOD
virtual void f() {}
#endif
};
void main()
{
B* pd = new B;
C* pc = dynamic_cast(pd); // ok: C is a direct base class
// pc points to C subobject of pd
D* pb = dynamic_cast(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
C* pe = dynamic_cast(pb);
}
// class Base
// {
// public:
// virtual void f(){};
// };
// class DA : public Base
// {
// virtual void f(){}
// };
// class DB : public Base
// {
// virtual void f(){}
// };
// void g(Base* pB)
// {
// pB->f();//大多数情况下,我们只要这样调用就可以了,多态性保证会调用相应的函数
// //但是有时候我们需要知道具体类型具体处理,比方说对DA要进行特殊操作,就可以这样:
// DA* pD=dynamic_cast(pB);
// //如果pB指向一个DA对象的话,dynamic_cast会将其转化为DA*赋给pD,否则返回0
// }
// void main()
// {
// DA* da = new DA;
// g(da);
// //pB->f();//大多数情况下,我们只要这样调用就可以了,多态性保证会调用相应的函数
// //但是有时候我们需要知道具体类型具体处理,比方说对DA要进行特殊操作,就可以这样:
// DA* pD=dynamic_cast(da);
// }
若不存在虚函数,则产生以下错误:
E:/TEST/upcast/upcast.cpp(46) : error C2683: dynamic_cast : 'B' is not a polymorphic type