运行时类型信息

运行时类型信息

动态类型转换

一.向下造型

•动态类型转换(dynamic_cast)用于将基类类型的指针或引用转换为其子类类型的指针或引用,前提是子类必须从基类多态继承,即基类包含至少一个虚函数

class A 
 { 
    virtual void foo (void) = 0; 
 };

–class B : public A { ... };

–B b; 
 A* pa = &b; 
 B* pb = dynamic_cast<B*> (pa); 
 A& ra = b; 
 B& rb = dynamic_cast<B&> (ra);

二.类型检查

•动态类型转换会对所需转换的基类指针或引用做检查,如果其目标确实为期望得到的子类类型的对象,则转换成功,否则转换失败
–不是对指针或引用做类型转换,编译错误
–转换目标和源不具多态继承性,编译错误
–转换源的目标对象非目标类型,运行错误

三.转换失败

•针对指针的动态类型转换,以返回空指针(NULL)表示失败,针对引用的动态类型转换,以抛出bad_cast异常表示失败

    –A* pa = ...; 
     B* pb = dynamic_cast<B*> (pa); 
     if (pb == NULL) 
        cout << "转换失败!" << endl;
    –A& ra = ...; 
     try 
     { 
        B& rb = dynamic_cast<B&> (ra); 
     } 
     catch (bad_cast& ex) 
     { 
        cout << "转换失败!" << endl; 
     }

typeid操作符

一.typeinfo对象

•typeid操作符既可用于类型也可用于对象
–int x;
typeid (int);
typeid (x);

•typeid操作符返回typeinfo对象的常引用

#include <typeinfo>
–typeinfo类的成员函数name(),返回空字符结尾的类型名 
    cout << typeid ( char (*(*[5]) (short (*) (int, long))) (float, double) ).name () << endl; 
    // A5_PFPFcfdEPFsilEE
–typeinfo类支持“==”和“!=”操作符,可直接用于类型相同与否的判断 
    if (typeid (*human) == typeid (Student)) 
    { ... }

二.动态与静态类型信息

•当typeid作用于基类类型的指针或引用的目标时,若基类包含至少一个虚函数,即存在多态继承,
该操作符所返回的类型信息将由该指针或引用的实际目标对象的类型决定,否则由该指针或引用本身的类型决定

class A {}; 
 class B : public A 
 { 
    virtual void foo (void) {} 
 }; // 继承 
 class C : public B {}; // 多态继承
–C c; 
 A& a = c; 
 cout << typeid (a).name () << endl; // 1A - 静态类型 
 B& b = c; 
 cout << typeid (b).name () << endl; // 1C - 动态类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值