【深度C++】之“dynamic_cast”

0. dynamic_cast

dynamic_cast是实现 运行时类型识别(run-time type identification, RTTI)功能的方法之一,另一个是typeid

dynamic_cast同时也是显示类型转换的功能之一,主要解决的就是具有继承关系的子类和父类间的转换

1 具体功能

1.1 使用方法

dynamic_cast主要有3种形式:

1. dynamic_cast<type *>(expr)   // 指针
2. dynamic_cast<type &>(expr)   // 左值引用
3. dynamic_cast<type &&>(expr)  // 右值引用

3种形式中所有的type必须是类类型 且应该 含有虚函数

3种形式对应的硬性要求分别是:

  1. 指针必须有效
  2. expr必须是左值
  3. expr不能是左值

满足任一以下条件,转换成功:

  1. expr是type类型的公有派生类
  2. expr是type类型的公有基类
  3. expr是type类型本身

否则转换失败。

失败时:

  1. 指针返回0
  2. 引用抛出bad_cast异常

使用dynamic_cast最好进行if判断和异常获取,如下面的指针和引用的例子。

1.2 指针

Derived d;
Base *base_ptr = &d;
if (Derived *derived_ptr = dynamic_cast<Derived *>(base_ptr)) {
    cout << "cast succeed" << endl;
    derived_ptr->func();
} else {
    cout << "cast failed" << endl;
    base_ptr->func();
}

程序将会输出cast succeed。

1.3 引用

Derived d;
Base &base_ref = d;
try {
    auto &derived_ref = dynamic_cast<Derived &>(base_ref);
    cout << "cast succeed" << endl;
    derived_ref.func();
} catch (bad_cast) {
    cout << "cast failed" << endl;
    base_ref.func();
}

程序将会输出cast succeed。

1.4 不会取消const

转换过程中会保留expr的const信息,例如:

Derived d;
// 与上面示例不一样
const Base &base_ref = d;
try {
    // ERROR: 编译不能通过
    auto &derived_ref = dynamic_cast<Derived &>(base_ref);
    cout << "cast succeed" << endl;
    derived_ref.func();
} catch (bad_cast) {
    cout << "cast failed" << endl;
    base_ref.func();
}

编译报错。

指针同理,如果指针具有底层const,则会报错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值