2016-11-29 8 views
11

以下を考慮してください。C++で継承階層の一部を隠すことはできますか?

クラスBは、クラスAから公に継承されます。どちらもライブラリに用意されており、私はそれらを変更することはできません。

私はBから派生するクラスFooを実装したいが、私はFooのユーザーが(ないBから)AFooの唯一の公共の機能を使用できるようにしたいです。それらについては、FooBから継承されているということは関係ありませんが、これは原理的には避けられない実装の詳細です。

したがって、原則として、FooAから一般に継承されますが、私的にはBになります。

C++にはこれを行うためのいくつかの構造体がありますか?

私の場合、AQObjectIs it safe to use *virtual* multiple inheritance if QObject is being derived from DIRECTLY?を参照)から派生しているため、仮想継承はオプションではありません。

(NB:興味がある人のために:私の場合には、AQWindowBQt3DExtras::Qt3DWindowである):この以来

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; } 
}; 
+1

'struct foo:A {B b; } '仕事? – Danh

+1

あなたのクラスがBから派生したことを記録しないでください。それがAから派生しているとします。これは、Bへのアクセスを希望するユーザーを停止するメソッドではありません。 –

答えて

9

これがあなたができる最も近いと思います:

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

Qtの重要な部分である 'A * a = pointer_to_foo'は動作しません – Danh

+0

@ダン、参照を好む別の理由。ビルトイン型であるため、ポインタ強制を追加できません。 OPは明示的にキャストする必要があります。 – StoryTeller

+0

はい、私も参照を使用するのが好きですが、AFAIKはQtが一般的にどのように動作するかを表しています – Danh

2

はQtの、私であるあなたがC++で行うことができます最も近いがこれです

+0

これは、 'Foo'の中に2つの' A'を、 'b'の一部として継承された1つを提供します。 (具体的には、2つの 'QWindow'があります。間違っています - これはちょうど* 1つのウィンドウですか?)これは望ましくないかもしれません。また、 'Foo'は' B'でなければならないとします。例えば、 'B'へのポインタとしてポインタが格納されているからです。 –

+0

@ PeterA.Schneider OPが言った_それらのために、FooがB_ – Danh

+0

から継承することは関係ありません。*ユーザー*のためではなく、どこかが要件でなければならない - 結局は避けることはできません。 –

関連する問題