假設我有這些抽象類Foo
和Bar
:有沒有辦法轉發聲明協方差?
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
進一步假設我有派生類ConcreteFoo
和ConcreteBar
。我想協變細化的foo()
和bar()
方法,像這樣的返回類型:
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
因爲我們敬愛的單次編譯器這不會編譯不知道ConcreteBar
將從Bar
繼承,並讓ConcreteBar
是一個完全合法的協變返回類型。簡單的向前聲明ConcreteBar
也不起作用,因爲它沒有告訴編譯器有關繼承的任何信息。
這是C++的一個缺點我必須忍受這種困境嗎?
我們很多人都認爲協方差不必要的 - 看到這個問題http://stackoverflow.com/questions/1260757/when-is-c-covariance-the-best-solution這是據我有關人員未能激起令人信服的答覆。 – 2009-08-18 12:24:32
我正在使用大量現有代碼的kloc進行項目。簡單地通過協變地改變一些方法的返回類型,我能夠擺脫許多static_casts。如果我對上述問題有一個引人注目的解決方案,我可以擺脫更多。 – Tobias 2009-08-19 14:46:03