Supongamos que tengo estas clases abstractas y Foo
Bar
:¿Hay alguna manera de reenviar declarar covarianza?
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
Supongamos, además, que tengo la clase derivada ConcreteFoo
y ConcreteBar
. Quiero afinar covariantly el tipo de retorno de los foo()
bar()
y métodos como éste:
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
Esto no se compilará ya nuestro querido compilador de una sola pasada no sabe que ConcreteBar
heredarán de Bar
, y por lo que es ConcreteBar
un tipo de devolución covariante perfectamente legal. Simple forward declarar ConcreteBar
tampoco funciona, ya que no le dice nada al compilador sobre la herencia.
¿Esto es una deficiencia de C++ tendré que vivir o hay realmente una manera de evitar este dilema?
Muchas pensar en covarianza como innecesario - ver esta pregunta http://stackoverflow.com/questions/1260757/when-is-c-covariance-the-best-solution que en la medida que a mí preocupado no ha podido provocar una respuesta convincente. –
Estoy trabajando en un proyecto con toneladas de kloc de código existente. Simplemente cambiando de forma coherente el tipo de devolución de algunos métodos, pude deshacerme de muchos static_casts. Si tuviera una solución convincente para el problema anterior, podría deshacerme de aún más. – Tobias