c++ dynamic_cast

IEEE 754 浮点数转换 - 锤子在线工具

浮点数-Float-Double转二进制 - ToolTT在线工具箱

Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析 - 谢维开 - 博客园

c++ dynamic_cast

dynamic_cast 是 C++ 中用于在运行时安全地进行多态类型转换的操作符。它特别有用在涉及继承层次结构的指针或引用之间转换时,其中类型安全是一个关键问题。dynamic_cast 支持两种类型的转换:

  1. 向下的(从基类到派生类)‌:当你试图将一个指向基类对象的指针或引用安全地转换为指向派生类对象的指针或引用时。这种转换在运行时进行检查,如果转换是非法的(例如,实际对象并不是目标派生类的一个实例),则指针类型的转换会返回 nullptr,引用类型的转换会抛出 std::bad_cast 异常。
  2. 向上的(从派生类到基类)‌:虽然这种类型的转换在编译时通过普通的强制类型转换(static_cast)就可以实现,但 dynamic_cast 同样支持这种类型的转换,并且在运行时不会进行任何检查,因为向上转换总是安全的。

使用 dynamic_cast 的前提条件

为了使用 dynamic_cast,需要满足以下条件:

  • 操作的对象类型必须是多态的,这意味着类必须至少有一个虚函数。通常,这意味着类有一个虚析构函数或者至少一个其他虚函数。
  • 你只能在指针(或引用)类型之间使用 dynamic_cast,这些类型涉及继承。

示例

下面是一个使用 dynamic_cast 的简单示例,展示了如何在基类指针和派生类指针之间进行转换。

cppCopy Code

#include <iostream>

#include <typeinfo>

class Base {

public:

    virtual ~Base() {}  // 为了使 Base 成为多态类,添加一个虚析构函数

};

class Derived : public Base {

    void derivedFunc() { std::cout << "Derived function.\n"; }

};

class AnotherClass : public Base {};

int main() {

    Base* b1 = new Derived();

    Base* b2 = new AnotherClass();

    Derived* d = dynamic_cast<Derived*>(b1);

    if (d != nullptr) {

        d->derivedFunc();  // 成功转换,调用派生类的函数

    } else {

        std::cout << "b1 is not of type Derived\n";

    }

    Derived* d2 = dynamic_cast<Derived*>(b2);

    if (d2 == nullptr) {

        std::cout << "b2 is not of type Derived\n";  // 转换失败

    }

    delete b1;

    delete b2;

    return 0;

}

在这个例子中,b1 实际上指向一个 Derived 对象,所以 dynamic_cast<Derived*>(b1) 成功,并返回一个指向 Derived 对象的指针。而 b2 指向一个 AnotherClass 对象,所以 dynamic_cast<Derived*>(b2) 失败,并返回 nullptr。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值