2016-11-29 127 views
11

請考慮以下內容:能在C++中隱藏部分繼承層次結構嗎?

B公開繼承A類。兩者都在庫中提供,我不能修改它們。

我想實現一個類FooB派生的,但我想允許的Foo用戶使用的(來自B不)AFoo唯一的公共職能。對於他們而言,Foo繼承自B並不相關,原則上這是我無法避免的實現細節。

所以,原則上我想FooA公開繼承,但私下從B

C++中是否有一些構造允許我這樣做?

我必須補充說,虛擬繼承不是一個選項,因爲A,在我的情況下,從QObject派生(見Is it safe to use *virtual* multiple inheritance if QObject is being derived from DIRECTLY?)。

(注:對於有興趣的人:在我的情況,AQWindowBQt3DExtras::Qt3DWindow

+1

'struct foo:A {B b; 「工作? – Danh

+1

只是不記錄你的類派生自B.說它來自A.這不是一種方法來阻止一個確定的用戶想要訪問B,但沒有其他的東西。 –

回答

9

你可以在C++做的最接近的是這樣的:

class Foo : private B { 
    public: 
    using A::foo; // Expose function foo in Foo's API. 
    using A::bar; 
    operator A&() { return *this; } // Implicit conversion to `A` when needed. 
    operator A const&() const { return *this; } 
}; 
+2

'A * a = pointer_to_foo',這是Qt的重要組成部分,不起作用 – Danh

+0

@Danh,喜歡引用的另一個原因。因爲它們是內置類型,所以不能添加指針強制。 OP將不得不明確施放。 – StoryTeller

+0

是的,我也喜歡使用引用,但AFAIK它是如何Qt一般工作 – Danh

2

由於這是Qt的,我認爲這是最接近你可以做的:

struct Foo : A { 
    // override all function of A, forward its to B 
private: 
    B b; // or pointer to B, it's depend on your design 
}; 
+0

這給你兩個'A'在一個'Foo'裏面,一個是繼承的,一個是'b'的一部分。 (具體來說,有兩個'QWindow's,這聽起來是錯誤的 - 這只是一個窗口,不是嗎?)這可能不是期望的。我還假設'Foo'必須*是'B',例如因爲指向它的指針被存儲爲指向'B'的指針。 –

+0

@ PeterA.Schneider OP對於他們來說,Foo繼承B_ – Danh

+0

並不相關,不是爲了*用戶*,而是某個地方必須是一個需求 - 畢竟它是無法避免的。 –