Supposons que j'ai ces classes abstraites Foo
et Bar
:Existe-t-il un moyen de transmettre la covariance?
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
On suppose en outre que j'ai la classe dérivée ConcreteFoo
et ConcreteBar
. Je veux raffiner covariante le type de retour des méthodes foo()
et bar()
comme ceci:
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
Ce ne sera pas compilé depuis notre bien-aimé compilateur monopasse ne sait pas que ConcreteBar
va hériter de Bar
, et que ConcreteBar
est un type de retour covariant parfaitement légal. Plain avant déclarant ConcreteBar
ne fonctionne pas non plus, car il ne dit rien au compilateur sur l'héritage.
Est-ce une lacune de C++ avec laquelle je devrai vivre ou y a-t-il un moyen de contourner ce dilemme?
Beaucoup nous pensons que covariance unecessary - voir cette question http://stackoverflow.com/questions/1260757/when-is-c-covariance-the-best-solution qui, autant que je suis concerné n'a pas réussi à provoquer une réponse convaincante. –
Je travaille sur un projet avec des tonnes de kloc de code existant. En changeant de manière covariante le type de retour de quelques méthodes, j'ai pu me débarrasser de beaucoup de static_casts. Si j'avais une solution convaincante au problème ci-dessus, je pourrais m'en débarrasser encore plus. – Tobias