Bu soyut sınıflarım Foo
ve Bar
olduğunu varsayalım:Kovaryans bildirmek için bir yol var mı?
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
Daha ileride ConcreteFoo
ve ConcreteBar
türetilmiş sınıflara sahip olduğumu varsayalım. Xzx43 ve bar()
yöntemlerinin dönüş türünü kovaryant olarak düzeltmek istiyorum:
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
Bu bizim sevgili tek geçişli derleyicimizin ConcreteBar
Bar
'dan miras alacağını bilmediğinden Mükemmel bir yasal kovaryant dönüş tipi. Düz bir şekilde ConcreteBar
bildirme işlemi, derleyiciye mirasla ilgili bir şey söylemediğinden çalışmaz.
Bu C++ 'nın bir eksikliği mi Yaşanacağım yoksa bu ikilemin etrafında bir yol var mı?
bize gereksiz olarak kovaryans düşünüyorum Bir çok - bu soruyu http://stackoverflow.com/questions/1260757/when-is-c-covariance-the-best-solution görüyoruz Bana göre hangi İlgili, zorlayıcı bir cevabı provoke edemedi. –
Bir ton kloc varolan kod içeren bir proje üzerinde çalışıyorum. Sadece birkaç yöntemin dönüş türünü kovaryant olarak değiştirerek birçok static_cast'den kurtulmayı başardım. Yukarıdaki problem için zorlayıcı bir çözümüm olsaydı, daha da kurtulabilirdim. Kod çalışması için – Tobias