我正在尝试执行以下操作:
class Animal
{
class Bear : public Animal
{
// …
};
class Giraffe : public Animal
{
// …
};
};
...但是我的编译器似乎对此嗤之以鼻。这是合法的C ++,如果没有,是否有更好的方法来完成同样的事情?基本上,我想创建一个更清晰的类命名方案。 (我不想从公共基类派生Animal
和内部类)
答案 0 :(得分:43)
你可以做你想做的事,但你必须延迟嵌套类的定义。
class Animal
{
class Bear;
class Giraffe;
};
class Animal::Bear : public Animal {};
class Animal::Giraffe : public Animal {};
答案 1 :(得分:15)
在到达定义的末尾之前,类类型被认为是不完整的。你不能从不完整的类继承,所以你不能从封闭的类继承。
编辑:更正
正如Richard Wolf纠正我的那样:如果延迟嵌套类的定义,可以从封闭类继承。有关详细信息,请参阅他的回答。
答案 2 :(得分:2)
没有真正回答这个问题,但我认为你是在滥用嵌套类,也许你应该看看命名空间(顺便说一句,答案是“它不可能,因为Animal是一个不完整的类型”)
答案 3 :(得分:2)
我不清楚你想在这里实现什么,但你可以通过命名空间获得它。
namespace creatures
{
class Animal
{
};
class Bear : public Animal
{
};
class Giraffe : public Animal
{
};
}
这将Bear和Giraffe声明为动物的类型,但如果您正在寻找不污染全局命名空间的基类,则将整个事物放在命名空间中。
答案 4 :(得分:0)
总是值得考虑“倒置继承”的ATL方法。每次我需要这样做时都会让我的头受伤,但是你获得的对象代码的效率是无与伦比的。在某处,我剪切了吉姆贝弗里奇的文章,这是我见过的最好的解释,但今天很难找到,我只是看到它的参考。
“2004年3月25日......来自Jim Beveridge的精彩文章:ATL和颠倒传承......”