我有一個相當複雜的類層次結構,其中類是相互交叉依賴的:有兩個抽象類A和C,分別包含一個返回C和A實例的方法。在他們的繼承類中,我想使用一種協變類型,在這種情況下,這是一個問題,因爲我不知道如何前向聲明繼承關係。C++:如何避免繼承類中的「無效協變返回類型」而無需投射?
我得到一個「test.cpp:22:error:'虛擬D * B :: outC()'的無效協變返回類型 - 錯誤,因爲編譯器不知道D是C的一個子類。
class C;
class A {
public:
virtual C* outC() = 0;
};
class C {
public:
virtual A* outA() = 0;
};
class D;
class B : public A {
public:
D* outC();
};
class D : public C {
public:
B* outA();
};
D* B::outC() {
return new D();
}
B* D::outA() {
return new B();
}
如果我將B :: outC()的返回類型更改爲C *,示例將編譯。有沒有什麼方法可以將B *和D *作爲返回類型保留在繼承類中(這對我來說有一種直觀的方式)?
你真的需要這種類型的糾纏? (稱它耦合可能有點短) – 2010-03-09 17:17:34
有時候這不是語言問題,這是我們嘗試使用它的方式的一個問題。如果你的兩個層次結合得如此緊密,我認爲你最好用一個層次結構(將'A'與'C'和'B'與'D'融合在一起),因爲它看起來好像它們不能互不干擾。 – 2010-03-09 19:38:37
嗯,我有兩種類型的類:一個任務的規範和一個實際執行任務的執行程序(啓動幾個線程)。 規範本身應該是任務的工廠,每個執行者都需要訪問它的規範。他們的任務有各種規格。所以執行者包裝了一個規範,所以耦合只在一個方向上很強,而在另一個方向上它只是工廠方法。 – Searles 2010-03-09 21:34:09