继承类型转换
派生类对象向基类的类型转换
因为派生类对象中含有与基类对应的组成部分, 所以能把派生类对象当成基类对象来使用,我们可以将基类的指针或引用绑定到派生类对象中的基类部分上.
Quoto item; // 基类
Bulk_quote bulk; // 派生类
Quote item *p = &item
p = &bulk; // p指向bulk的Quote部分
Quote &r = bulk; // r绑定到bulk的Quote部分
静态类型与动态类型
表达式的静态类型在编译时是已知的,它是变量声明时的类型或表达式生成的类型.动态类型则是变量或表达式表示的内存中的对象的类型.动态类型直到运行才已知.如果表达式既不是引用也不是指针,则它的动态类型永远与静态类型一致.
不存在基类向派生类的隐式类型转换.即使一个基类指针或引用绑定在一个派生类对象上,我们也不能指向从基类向派生类的转换:
Bulk_quote bulk;
Quote *itemP = &bulk; // 正确:动态类型时Bulk_quote
Bulk_quote *bulkp = itemP; // 错误:不能将基类换成派生类
编译器在编译时无法确定某个特定的转换在运行时是否安全,这因为编译器只能通过检查指针或引用的静态类型来推断该转换是否转换.
在对象之间不存在类型转换
派生类向基类的自动类型转换只对指针或引用有效,在派生类和基类之间不存在这样的转换.
派生类向基类转换的可访问性
派生类向基类的转换是否可访问由使用该转换的代码决定,同时派生类的派生访问说明符也会有影响,假定D继承B.
- 只有D公有继承B时,用户代码才能使用派生类向基类的转换;如果D继承B的方式是保护或私有,则用户代码不能使用该转换.
- 不论D以什么方式继承B,D的成员函数和友元都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的.
- 如果D继承B的方式是公有的或是保护的,则D的派生类的成员和友元可以使用D向B的类型转换;反之,如果D继承B的方式是私有的,则不能使用.