編譯器會將這種情況(即試圖調用(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