编译器会将这种情况(即试图调用(some instance of RoboticsEngineer).buildRobot()
)标记为错误。
这是因为派生类对象已经得到了双方的基本对象的副本(A MechanicalEngineer
实例和ElectricalEngineer
实例)的自身内部和单独的方法签名是不够的,告诉使用哪一个。
如果您在RoboticsEngineer
覆盖buildRobot
,你就可以明确地说,其继承的方法通过在前面的类名来使用,例如:
void RoboticsEngineer::buildRobot() {
ElectricalEngineer::buildRobot()
}
通过同一枚硬币,你实际上可以“力”在这种情况下
(some instance of RoboticsEngineer).ElectricalEngineer::buildRobot();
的ElectricalEngineer
实施方法将被调用,不会产生歧义:编译器通过与类名前缀它使用一个版本或其他的buildRobot
。
当你有一个Engineer
基类都MechanicalEngineer
和ElectricalEngineer
和您指定的继承是在这两种情况下virtual
一种特殊情况给出。当使用virtual
时,派生对象不包含Engineer
的两个实例,但编译器确保只有一个实例。这应该是这样的:
class Engineer {
void buildRobot();
};
class MechanicalEngineer: public virtual Engineer {
};
class ElectricalEngineer: public virtual Engineer {
};
在这种情况下,
(some instance of RoboticsEngineer).buildRobot();
将可以解决,而模糊。如果buildRobot被声明为virtual
并且在两个派生类之一中被重写,情况也是如此。无论如何,如果两个派生类(ElectricalEngineer和MechanicalEngineer)都会覆盖buildRobot
,则会再次产生歧义,编译器会将调用(some instance of RoboticsEngineer).buildRobot();
时的尝试标记为错误。
如果一个类有一个方法'buildRobot'并且一个接口有一个'buildRobot'方法并且你定义了一个也实现了接口的子类,那么Java会发生什么? – toto2
@toto显然,只要返回类型相同就可以,请参阅此[线程](http://stackoverflow.com/questions/2801878/implemeting-2-interfaces-in-a-class-with-same-方法 - 这界面法-是-OV)。 – toto2