向上转型和向下转型

文章讨论了C++中的类继承关系下的对象转换,包括向上转型(派生类到基类)和向下转型(基类到派生类)。向上转型不会丢失信息,而向下转型可能存在风险,需要谨慎使用,通常借助dynamic_cast确保安全性。文章强调了使用引用和指针以及了解类型信息的重要性。
摘要由CSDN通过智能技术生成

向上转型和向下转型

派生类对象可以转换为父类的对象,或者赋值给父类,示例(Derived继承Base类):

Base myBase {myDerivd};

这种情况下会导致截断,因为赋值结果是Base类的对象,而Base类的对象缺少Dervied类中定义的附加功能。然而,如果用派生类对基类的指针或引用赋值,则不会产生截断:

Base& myBase {myDerived}

这是通过基类使用派生类的正确途径,也被称为向上转型。这也是让方法和函数使用类的引用而不是直接使用类的对象的原因。通过使用引用,派生类在传递的时候没有发生截断。

将基类转换为派生类也被称为向下转型,专业的c++程序员一般是不会使用这种转换的。因为无法保证对象实际上属于派生类,也因为向下转型是不好的设计。

例如:

void func(Base *base) 
{
	Derived* myDerived {static_cast<Derived*>(base)};
}

如果func函数及其所有调用func函数的函数都是一个人所写,那么没啥太大问题,毕竟作者自己知道这个函数需要Derived* 类型的参数。但是如果说其他程序员调用该函数,他们可能传递Base*,编译期的检测无法强制参数类型。因此函数盲目的假定参数base实际上是一个指向Derived对象的指针。

向下转型有时候又是必须的,在可控的环境下可以充分利用这种转换。如果打算使用这种转换,应该使用dynamic_cast(),以使用对象的内建类型信息,拒绝没有意义的类型转换,这种内建信息通常驻留在虚表中,这意味着dynamic_cast()只能用于具有虚表的对象,即至少有一个虚成员的对象。如果针对某个指针的dynamic_cast()失败,这个指针的值就是nullptr,而不是指向某个无意义的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值