【cmu15445c++入门】(12)C++的dynamic_cast(类型转换)

本文详细介绍了C++中的dynamic_cast操作符,包括其在对象向上转型(基类到派生类)和向下转型(派生类到基类)中的使用,以及它如何处理虚函数和运行时类型信息。
摘要由CSDN通过智能技术生成

一、简介

dynamic_cast 是 C++中的一种类型转换操作符,主要用于处理类层次结构中的向上和向下转换。其主要用途包括:

对象向上转型:将基类指针或引用安全地转换为派生类指针或引用。

对象向下转型:将派生类指针或引用转换为基类指针或引用。

二、代码


#include <iostream>

class Base {
 public:
  virtual void f() {}
};
class Derived : public Base {
 public:
  void f() { std::cout << "I am Derived" << std::endl; }
};

int main() {
  // 1. 向下转型(Down-casting)(父类转子类)
  // 尝试将基类指针转换为派生类指针,这是不安全的,因为基类指针可能指向派生类的对象,也可能指向不相关的其他类型的对象。
 //如果转换不安全,dynamic_cast 会返回 nullptr。
  Base* base_up = new Base;
  Derived* derived_up =
      dynamic_cast<Derived*>(base_up);  // 无效的转换,结果为 nullptr
  if (derived_up) {
    std::cout << "Base to Derived succeed (base_up)" << std::endl;
    derived_up->f();
  } else {
    std::cout << "Base to Derived fail for null (base_up)" << std::endl;
  }
  Base* base_up2 = new Derived;
  Derived* derived_up2 =
      dynamic_cast<Derived*>(base_up2);  
  if (derived_up2) {
    std::cout << "Base to Derived succeed (base_up2) " << std::endl;
    derived_up2->f();
  } else {
    std::cout << "Base to Derived fail for null (base_up2)" << std::endl;
  }

  // derived_up转换失败是一个nullptr。(因为derived_up 实际上不指向 Derived 类的对象),
  // derived_up2转换成功,将是一个有效的指针

  // 2. 向上转型(Up-casting)
  // 将派生类指针转换为基类指针是安全的,因为所有的派生类对象都是基类对象。在这种情况下,dynamic_cast 会成功地执行转换
  Derived* derived_down = new Derived;
  Base* base_down =
      dynamic_cast<Base*>(derived_down);  // 有效的转换,结果不为 nullptr
  if (base_down) {
    std::cout << "Derived to Base succeed " << std::endl;
    base_down->f();
  } else {
    std::cout << "Derived to Base fail for null" << std::endl;
  }


  // 注意点:
  //  dynamic_cast 只能用于含有虚函数的类。这是因为 dynamic_cast
  //  需要运行时类型信息(RTTI)来确定对象的实际类型。 在进行 dynamic_cast
  //  时,如果转换不安全,dynamic_cast 会返回 nullptr,而不是抛出异常。这是因为
  //  C++ 的异常处理机制不适用于指针类型。
  //  对于引用类型的转换,如果转换不安全,会直接产生运行时错误,程序会终止。
  return 0;
}

三、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康雨城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值