Supponiamo che io sono queste classi astratte Foo
e Bar
:C'è un modo per inoltrare la dichiarazione di covarianza?
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
Supponiamo inoltre che ho la classe derivata ConcreteFoo
e ConcreteBar
. Voglio perfezionare covariantly il tipo di ritorno dei foo()
e bar()
metodi come questo:
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
Questo non verrà compilato dal nostro amato compilatore unico passaggio non sa che ConcreteBar
erediterà da Bar
, e in modo che sia ConcreteBar
un tipo di ritorno covariante perfettamente legale. La semplice dichiarazione in avanti ConcreteBar
non funziona, poiché non dice al compilatore nulla sull'ereditarietà.
Si tratta di un problema di C++ con cui dovrò convivere o esiste un modo per aggirare questo dilemma?
Un sacco pensare di covarianza come unecessary - vedere questa domanda http://stackoverflow.com/questions/1260757/when-is-c-covariance-the-best-solution che, per quanto mi interessato non è riuscito a provocare una risposta convincente. –
Sto lavorando su un progetto con tonnellate di kloc di codice esistente. Semplicemente cambiando covarianmente il tipo di ritorno di alcuni metodi sono stato in grado di sbarazzarmi di molti static_casts. Se avessi una soluzione convincente al problema di cui sopra, potrei sbarazzarmene ancora di più. – Tobias