Załóżmy, że mam tych klas abstrakcyjnych Foo
i Bar
:Czy istnieje sposób przekazania do przodu zadeklarowania kowariancji?
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
Załóżmy ponadto, że mam klasę pochodną ConcreteFoo
i ConcreteBar
. Chcę covariantly udoskonalić typ Powrót foo()
bar()
metod i tak:
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
Nie będzie to skompilować od naszego ukochanego towarzysza pojedynczy kompilator nie wie, że ConcreteBar
będzie dziedziczyć Bar
, i tak jest, że ConcreteBar
całkowicie legalny kowariantowy typ zwrotu. Zwykłe forwardowanie deklaracji ConcreteBar
również nie działa, ponieważ nie informuje kompilatora o dziedziczeniu.
Czy to jest niedociągnięcie C++, z którym będę musiał żyć, czy też rzeczywiście istnieje sposób obejścia tego dylematu?
Dużo nam myśleć kowariancji jako unecessary - patrz na to pytanie http://stackoverflow.com/questions/1260757/when-is-c-covariance-the-best-solution który w miarę jestem zaniepokoiła się nie wywołała przekonującej odpowiedzi. –
Pracuję nad projektem z tonami kodu istniejącego kodu. Po prostu przez współzmienną zmianę typu zwrotu kilku metod udało mi się pozbyć wielu static_casts. Gdybym miał przekonujące rozwiązanie powyższego problemu, mógłbym pozbyć się jeszcze więcej. – Tobias