El compilador marcará este tipo de situación (es decir, intentando llamar al (some instance of RoboticsEngineer).buildRobot()
) como un error.
Esto ocurre porque el objeto derivado tiene una copia de ambos objetos base (una instancia MechanicalEngineer
y una instancia) dentro de sí mismo y la firma del método por sí sola no es suficiente para indicar cuál utilizar.
Si reemplaza buildRobot
en su RoboticsEngineer
, usted será capaz de decir explícitamente que heredó método a utilizar como prefijo el nombre de la clase, por ejemplo:
void RoboticsEngineer::buildRobot() {
ElectricalEngineer::buildRobot()
}
Por la misma moneda, en realidad se puede "forzar" el compilador de usar una u otra versión de buildRobot
prefijándolo con el nombre de clase:
(some instance of RoboticsEngineer).ElectricalEngineer::buildRobot();
en este caso la aplicación ElectricalEngineer
del método será llamado, sin ambigüedad.
Un caso especial se da cuando se tiene una clase base para Engineer
tanto MechanicalEngineer
y ElectricalEngineer
y especifica la herencia de ser virtual
en ambos casos. Cuando se usa virtual
, el objeto derivado no contiene dos instancias de Engineer
, pero el compilador se asegura de que solo haya una. Este sería el siguiente:
class Engineer {
void buildRobot();
};
class MechanicalEngineer: public virtual Engineer {
};
class ElectricalEngineer: public virtual Engineer {
};
En este caso,
(some instance of RoboticsEngineer).buildRobot();
se resolverán sin ambigüedades. Lo mismo es cierto si buildRobot se declara virtual
y se reemplaza en una de las dos clases derivadas. De todos modos, si ambas clases derivadas (ElectricalEngineer y MechanicalEngineer) anulan buildRobot
, entonces la ambigüedad surge una vez más y el compilador marcará el intento de llamar a (some instance of RoboticsEngineer).buildRobot();
como un error.
¿Qué sucede en Java si una clase tiene un método 'buildRobot' y una interfaz tiene un método' buildRobot' y define una subclase que también implementa la interfaz? – toto2
@toto Aparentemente está bien siempre que el tipo de devolución sea el mismo, vea este [hilo] (http://stackoverflow.com/questions/2801878/implemeting-2-interfaces-in-a-class-with-same- method-which-interface-method-is-ov). – toto2