Así que después de buscar mucho para encontrar una respuesta a mi pregunta, finalmente abandoné mis habilidades con Google.Redefinir un typedef en la clase derivada?
I tienen una clase base Base, y una clase derivada Derivado. Quiero sobrescribir un tipo en la clase Base con uno en la clase Derived. He aquí un ejemplo:
class Apple {
public:
Apple() { }
// ...
};
class Orange {
public:
Orange() { }
// ...
};
class Base {
public:
typedef Apple fruit;
// ...
virtual fruit func() { return Apple(); }
};
class Derived : public Base {
public:
typedef Orange fruit;
// ...
fruit func() override { return Orange(); } // <-- Error C2555!
};
Este código no funciona, y le da una opción más arriba
C2555 error ('Derived::func': overriding virtual function return type differs and is not covariant from 'Base::func').
fue una de las soluciones que he probado. También intenté crear una clase anidada virtual en el Base, y redefiní en Derivada, y eso no compiló también (también fue muy desordenado).
Asimismo, no puede derivar manzanas y naranjas de la misma clase base para volver puntero/referencia a su clase padre en Base y Derivado. Necesito devolver físicamente una instancia del objeto.
- ¿Hay alguna forma en que pueda declarar typedefs abstractos?
- Si no es así, ¿hay alguna otra solución que pueda lograr lo que estoy tratando de hacer?
La palabra clave 'override' ayuda a eliminar los errores humanos (como los errores tipográficos) al hacer que el compilador compruebe si la función en realidad está anulando cualquier método base o no. En cuanto al problema, soy consciente de eso. ¿Hay alguna forma en que podría hacerlos covariantes sin el uso de punteros o referencias? – Zeenobit
Así que supongo que no hay solución para que esto funcione. Gracias gente. Trataré de usar una jerarquía diferente. – Zeenobit