问题 可以在C ++中隐藏继承层次结构的一部分吗?


考虑以下:

B 从班级公开继承 A。两者都在库中提供,我无法修改它们。

我想实现一个类 Foo 源自 B,但我想允许用户 Foo 仅使用公共功能 A 和 Foo (不是来自 B)。对他们而言,与此无关 Foo 继承自 B,这原则上是我无法避免的实施细节。

所以,原则上我想要 Foo 公开继承 A,但私下来自 B

C ++中是否有一些构造允许我这样做?

我必须补充一点,因为虚拟继承不是一种选择 A就我而言,源于 QObject (看到 如果QObject是直接派生的,那么使用* virtual * multiple inheritance是否安全?)。

(注意:感兴趣的人:就我而言, A 是 QWindow 和 B 是 Qt3DExtras::Qt3DWindow


11626
2017-11-29 08:38


起源

不 struct foo : A { B b; } 工作? - Danh
只是不要记录你的类派生自B.假设它派生自A.这不是一种方法来阻止一个确定的用户想要访问B,但是没有别的。 - n.m.


答案:


你在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; }
};

9
2017-11-29 08:41



A * a = pointer_to_foo,这是Qt的重要部分,不起作用 - Danh
@Danh,更喜欢引用的另一个原因。您无法添加指针强制,因为它们是内置类型。 OP必须明确投出。 - StoryTeller
是的,我也更喜欢使用引用,但AFAIK就是Qt的工作原理 - Danh
@StoryTeller考虑提供转换 const A & 同样。 - Ralph Tandetzky
@RalphTandetzky,是的,这是一个好主意。我对c ++感到厌烦的是,无法一次性提供两者 - StoryTeller


由于这是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
};

2
2017-11-29 08:47



这给你两个 A在里面 Foo,继承的一个和一个作为的一部分 b。 (具体来说,有两个 QWindows,听起来不对 - 这只是 一 窗口,不是吗?)这可能不是所希望的。我也想一个 Foo 必须 是  一个 B例如,因为指向它的指针存储为指向a的指针 B。 - Peter A. Schneider
@ PeterA.Schneider OP说 对他们来说,Foo从B继承是不相关的 - Danh
不适合 用户,但某处必须是一项要求 - 毕竟这是无法避免的。 - Peter A. Schneider
@ PeterA.Schneider我认为OP有这个想法_一个我无法避免的实现细节_让他澄清一下这个要求 - Danh
理想的是保持平常 QWindow 包含用于3D表示的小部件,它将对应于此答案。但是,目前在Qt3D中必须为它创建一个窗口。原则上可以使用 QWidget::createWindowContainer() 嵌入窗口,但我认为问题本身很有趣,可能出现在另一个背景下,这就是我问的原因。 - oLen