C ++の保護されたクラスからの継承
-
03-07-2019 - |
質問
次の宣言があるとします:
class Over1
{
protected:
class Under1
{
};
};
次のことができることを知っています:
class Over2 : public Over1
{
protected:
class Under2 : public Under1
{
};
};
しかし、Over2なしでUnder2を宣言する方法はありますか?
Under1の派生物を使用するためにOver1を拡張する必要があるため、これはばかげているように見えるかもしれませんが、この状況では30種類のUnderが存在する可能性があります。次のいずれかを実行できます。
- それらをすべてOver1内に配置する:しない Over2は次のものしか使用できないため、魅力的です。 それらの1つまたは2つ
- それぞれを入れます 独自のバージョンのOver:Not それ以来魅力的です ほとんどから継承する 同じクラス。
- 作成する方法を見つける 作成せずにUnder1の子 Over1の子
これは可能ですか?
ありがとう。
解決
テンプレートと明示的な特殊化を使用すると、Over1でクラス宣言を1つ追加するだけでこれを実行できます。
class Over1
{
protected:
class Under1
{
};
template <typename T>
class UnderImplementor;
};
struct Under2Tag;
struct Under3Tag;
struct Under4Tag;
template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};
template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};
template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};
これがお役に立てば幸いです。
他のヒント
ネストされたクラスを作成するよりも、これらのclossesを名前空間に埋め込むことを検討することをお勧めします。そうすれば、内部クラスを取得するために外部クラスは必要ありません。 Google C ++スタイルガイドには賛否両論があります。
Under1を保護したい場合は、定義により、Over1から継承してアクセスする必要があります。 Under1を公開するか、ダグラスが提案した名前空間を使用することをお勧めします。
これらを今すぐテストするコンパイラーがないので、これらが機能するかどうかはまったくわかりませんが、試してみてください:
class Over1
{
protected:
class Under1
{
};
public:
class Under1Interface : public Under1
{
};
};
class Under2 : public Over1::Under1Interface
{
};
またはおそらく次のようなもの:
class Over1
{
protected:
class Under1
{
};
};
class Under2 : private Over1, public Over1::Under1
{
};
または偶数:
class Under2;
class Over1
{
friend class Under2;
protected:
class Under1
{
};
};
class Under2 : public Over1::Under1
{
};
ただし、すべてのOver1sプライベートをUnder2に公開しますが、おそらくあなたが望むものではありません。
ちょっとファンキーなデザインのように聞こえます。コードの構造を変えてみてください。これはデコレーターパターンの良い候補になると思います。基本クラスをさまざまなデコレーターでラップして、目的の機能を実現できます。「アンダー」のさまざまなフレーバーはデコレーターになります。あなたのコードの意図についてもっと知ることなく伝えるのは難しい思考です。