类型转换与继承

可以将基类的指针或引用绑定到派生类对象上有一层极为重要的含义:当使用基类的引用(或指针),实际上我们并不清楚该引用(或指针)所绑定对象的真实类型。

静态类型和动态类型
当我们使用存在继承关系的类型时,必须将一个变量或其他表达式的静态类型与该表达式表示对象的动态类型区分开来。表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型;动态类型则是变量或表达式表示的内存中的对象的类型。动态类型直到运行时才可知。

如果表达式既不是引用也不是指针,则它的动态类型永远与静态类型一致。

基类的指针或引用的静态类型可能与其静态类型不一致。

不存在从基类向派生类的隐式类型转换
因为一个基类的对象可能是派生类对象的一部分,也可能不是,所以不存在从基类向派生类的自动类型转换:

Base base;
Derived* derivedPtr = &base;    // 错误:不能将基类转换成派生类
Derived& derivedRef = base; // 错误:不能将基类转换成派生类

即使一个基类指针或引用绑定在一个派生类对象上,我们也不能执行从基类向派生类的转换。
如果在基类中含有一个或多个虚函数,我们可以使用dynamic_cast请求一个类型转换,该转换的安全检查将在运行时执行。同样,如果我们已知某个基类向派生类的转换是安全的,则我们可以使用static_cast来强制覆盖掉编译器的检查工作。
在对象之间不存在类型转换
派生类向基类的自动转换只对指针或引用类型有效,在派生类类型和基类类型之间不存在这样的转换。

当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生类部分将被忽略掉。

存在继承关系的类型之间的转换规则
要想理解在具有继承关系的类之间发生的类型转换,有三点非常重要:
1。从派生类向基类的类型转换只对指针或引用类型有效。
2。基类向派生类不存在隐式类型转换。
3。和任何其他成员一样,派生类向基类的类型转换也可能会由于访问受限而变得不可行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值