C++ 使用dynamic_cast执行基类向派生类的转换

本文详细介绍了C++中的dynamic_cast转换操作,它用于将基类指针或引用安全地转换为派生类指针或引用。dynamic_cast执行有条件转换,会在运行时检查类型兼容性,转换失败时会返回空指针或抛出异常。通过示例代码展示了dynamic_cast的使用场景,包括基类到派生类的转换,并分析了转换失败的情况。
摘要由CSDN通过智能技术生成

dynamic_cast与static_castconst_castreinterpret_cast并列的4种类型转换操作之一。它可以将基类的指针显示转换为派生类的指针,或将基类的引用显示转换为派生类的引用。但与static_cast不同的是,它执行的不是无条件的转换,它在转换前会检查指针(或引用)所指向对象的实际类型是否与转换的目的类型兼容,如果兼容转换才会发生,才能得到派生类的指针(或引用),否则:

  • 如果执行的是指针类型的转换,会得到空指针。
  • 如果执行的是引用类型的转换,会抛出异常。
#include <iostream>

using namespace std;

class Base{
	public:
		virtual void fun1(){
			cout << "Base::fun1()" << endl;
		}
		virtual ~Base(){}
}; 

class Derived1 : public Base{
	public:
		virtual void fun1(){
			cout << "Derived1::fun1()" << endl;
		}
		
		virtual void fun2(){
			cout << "Derived1::fun2()" << endl;
		}
};

class Derived2 : public Derived1{
	public:
		virtual void fun1(){
			cout << "Derived2::fun1()" << endl;
		}
		
		virtual void fun2(){
			cout << "Derived2::fun2()" << endl;
		}
};

void fun(Base * b){
	b -> fun1();
	Derived1 * d = dynamic_cast<Derived1*> (b);  // 尝试将 b 转换为 Derived1 指针 
	if (d!=0) {                             // 判断转换是否成功 
		d -> fun2();
	}
}

int main(){
	Base *base = new Base();
	fun(base);
	
	Derived1 *derived1 = new Derived1();
	fun(derived1);  // derived1 是 Derived1 类型的对象,对指向 derived1 的指针执行转换,成功得到  Derived1 类型的指针
	
	Derived2 *derived2 = new Derived2();
	fun(derived2); // Derived2 是 Derived1 的派生类,对指向 Derived2的指针执行转换,也能够成功得到 Derived1 类型的指针
	
	delete derived2;
	delete derived1;
	
	return 0;
}

注:
转换前类型必须是指向多态类型的指针,或多态类型的引用,而不能是指向非多态类型的指针或非多态类型的引用,这是因为C++只为多态类型在运行时保存用于运行时类型识别的信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值