9.10 将派生类对象隐式转换为基类对象
优质
小牛编辑
137浏览
2023-12-01
尽管派生类对象也是基类对象,但是派生类类型和基类类型是不同的。在 public 继承中,派生类对象能作为基类对象处理。由于派生类具有对应每个基类成员的成员(派生类的成员通常比基类的成员多),所以把派生类的对象赋给基类对象是合理的。但是,反过来赋值会使派生类中基类不具有的成员没有定义,所以这是不允许的。尽管如此,提供正确的重载赋值运算符和(或)转换构造函数可以允许这种操作(见第8章)。
常见编程错误 9.4
把派生类对象赋给其基类对象,然后试图在新的基类对象中引用只在派生类中才有的成员是十语法错误。
注意,在本节后面提到指针时,也适用于引用。
在 public 继承中,因为派生类对象也是基类对象,所以指向派生类对象的指针可以隐式地转换为指向基类对象的指针。
基类指针和派生类指针与基类对象和派生类对象的混合和匹配有如下四种可能的方式:
- 直接用基类指针引用基类的对象。
- 直接用派生类指针引用派生类的对象。
- 用基类指针引用一个派生类的对象。由于派生类的对象也是基类的对象,所以这种引用方式是安全的,但是用这种方法只能引用基类成员。如果试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。
- 用派生类指针引用基类的对象。这种引用方式会导致语法错误。派生类指针必须先强制转换为基类指针。
常见编程错误 9.5
将基类指针强制转换为派生类指针,如果用该指针引用基类对象,而基类对象中没有所要引用的派生类的成员,那么这时就会发生错误。
将派生类对象作为基类对象可能是很方便的,但使用基类指针操作这些对象容易出问题。例如,在某个计算工资单的系统中,我们希望能够遍历关于雇员的清单并计算出每人每周的工资。但是,使用基类指针使得程序只能调用基类的工资单计算例程(如果基类中确实存在该例程)。我们需要一种方法为每一个对象(不管它是派生类对象还是基类对象)调用正确的工资单计算例程,并且这种方法只需简单地使用基类指针。解决这个问题的答案是使用第10章介绍的虚函数和多态性。