假设类D、E和F都继承自基类B,而类C继承自D和E。
(i) 类C中有多少份类B的副本?
- 如果C继承自D和E,它们是B的子类,那么D和E在技术上是否是其超类的副本?因此,如果C继承自D和E,那么在C中将会有2个B的副本。
(ii) 使用虚继承会如何改变这种情况?请解释你的答案。
- 使用虚继承类似于在Java中使用抽象类。这意味着在C中不会有多个B的副本,因为实例化将向下级联到需要该实例的层级。例如,如果B具有名为print()的函数,它打印“我是B”,而C覆盖此函数并打印“我是C”。如果在没有虚拟的情况下调用C上的print(),则会打印“我是B”,而使用虚拟将意味着它将打印“我是C”。
(iii) Java如何避免对于许多可能在C++中使用多重继承的情况而言不需要多重继承的需要?
- Java可以使用接口来避免使用多重继承。您可以实现多个接口,但只能扩展一个类。这种方法使Java更具灵活性,同时避免了多重继承可能会导致的问题。
(i) 类C中有多少份类B的副本?
- 如果C继承自D和E,它们是B的子类,那么D和E在技术上是否是其超类的副本?因此,如果C继承自D和E,那么在C中将会有2个B的副本。
(ii) 使用虚继承会如何改变这种情况?请解释你的答案。
- 使用虚继承类似于在Java中使用抽象类。这意味着在C中不会有多个B的副本,因为实例化将向下级联到需要该实例的层级。例如,如果B具有名为print()的函数,它打印“我是B”,而C覆盖此函数并打印“我是C”。如果在没有虚拟的情况下调用C上的print(),则会打印“我是B”,而使用虚拟将意味着它将打印“我是C”。
(iii) Java如何避免对于许多可能在C++中使用多重继承的情况而言不需要多重继承的需要?
- Java可以使用接口来避免使用多重继承。您可以实现多个接口,但只能扩展一个类。这种方法使Java更具灵活性,同时避免了多重继承可能会导致的问题。