ネストされたC ++クラスは、その外側のクラスを継承することはできますか?
-
18-09-2019 - |
質問
私は、次の操作を実行しようとしています:
class Animal
{
class Bear : public Animal
{
// …
};
class Giraffe : public Animal
{
// …
};
};
...しかし、私のコンパイラは、この上で窒息して表示されます。この法的なC ++がある、とされていない場合、同じことを達成するためのより良い方法はありますか?基本的に、私はクリーンなクラスの命名規則を作成したいです。
(私は、共通の基本クラスからAnimal
と内部クラスを派生する必要はありません) 解決
あなたがやりたいことができますが、入れ子になったクラスの定義を延期する必要があります。
class Animal
{
class Bear;
class Giraffe;
};
class Animal::Bear : public Animal {};
class Animal::Giraffe : public Animal {};
他のヒント
クラスタイプが不完全であると考えられます。あなたは、クラスを囲むから継承することはできませんので、あなたが不完全なクラスから継承することはできません。
EDIT:を修正の
リチャード・ウルフは、私を修正したよう:あなたはネストされたクラスの定義を遅らせる場合が囲むクラスから継承することが可能です。詳細については、彼の答えを参照してください。
本当に(「動物が不完全な型であるため、それは不可能です」によって、答えは)多分あなたは名前空間を見ている必要があり、質問に答える、私はあなたが入れ子になったクラスを悪用しているとは思いませんます。
私はあなたがここで達成しようとしているものをクリアしていないよしかし、あなたが名前空間を経由してそれを得ることができるかもしれません。
namespace creatures
{
class Animal
{
};
class Bear : public Animal
{
};
class Giraffe : public Animal
{
};
}
これは、動物の種類としてクマやキリンを宣言していますがグローバル名前空間を汚染しないように、基本クラスを探している場合は、名前空間に全部を入れます。
これは、「アップサイドダウン継承」のATL方法を考慮し、常に価値があります。それは私の頭は、私はこれを行うために必要なすべての時間を傷つけるなりますが、あなたが得るオブジェクト・コードの効率は、他社の追随を許さないです。どこか私は私が今まで見た最高の説明だったジム・ベヴァリッジの記事をクリッピングが、これは今日を見つけるのは難しいですが、私はちょうどそれへの参照を参照してください。
「2004年3月25日...ジム・ベヴァリッジからの優れた記事:ATLとアップサイドダウン継承..」