运行时类型识别(RTTI)

通过以下两个操作符提供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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值