2016-11-29 87 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

并不相关,不是为了*用户*,而是某个地方必须是一个需求 - 毕竟它是无法避免的。 –