C++ 可以使用嵌套的C++;类是否继承其封闭类?

C++ 可以使用嵌套的C++;类是否继承其封闭类?,c++,inheritance,nested-class,C++,Inheritance,Nested Class,我正在努力做到以下几点: class Animal { class Bear : public Animal { // … }; class Giraffe : public Animal { // … }; }; …但我的编译器似乎被这个问题卡住了。这是合法的C++,如果不是,有没有更好的方法来完成同样的事情?本质上,我想创建一个更干净的类命名方案。(我不想从公共基类派生Animal和内部类)并不能真正回答这个

我正在努力做到以下几点:

class Animal
{
    class Bear : public Animal
    {
        // …
    };

    class Giraffe : public Animal
    {
        // …
    };
};

…但我的编译器似乎被这个问题卡住了。这是合法的C++,如果不是,有没有更好的方法来完成同样的事情?本质上,我想创建一个更干净的类命名方案。(我不想从公共基类派生
Animal
和内部类)

并不能真正回答这个问题,但我认为您误用了嵌套类,也许您应该看看名称空间(顺便说一句,答案是“不可能,因为Animal是一个不完整的类型”).

在到达其定义的末尾之前,类类型被视为不完整。不能从不完整的类继承,因此不能从封闭类继承

编辑:更正

正如RichardWolf纠正我的那样:如果延迟嵌套类的定义,则可以从封闭类继承。有关详细信息,请参见他的答案。

我不清楚您在这里想要实现什么,但您可以通过名称空间获得它

namespace creatures
{

class Animal
{
};

class Bear : public Animal
{
};

class Giraffe : public Animal
{
};


}

这将熊和长颈鹿声明为动物类型,但如果您希望基类不会污染全局名称空间,则将整个内容放在名称空间中。

您可以随心所欲,但必须延迟嵌套类的定义

class Animal
{
   class Bear;
   class Giraffe;
};

class Animal::Bear : public Animal {};

class Animal::Giraffe : public Animal {};

始终值得考虑“倒置继承”的ATL方法。每次我需要这样做的时候,它都会让我头疼,但是你得到的目标代码的效率是无与伦比的。在某个地方,我剪辑了吉姆·贝弗里奇的文章,这是我见过的最好的解释,但今天很难找到,我只是看到了对它的引用


“2004年3月25日…Jim Beverridge的一篇优秀文章:ATL和倒置继承…”

首先,您需要在类声明后用分号跟随右大括号。我不清楚为什么要这样做。如果我理解正确,Bear类将在其中包含一个Bear类,这。。。似乎有点奇怪。可以通过向前声明包含的类来实现。我不知道允许在封闭类之外定义嵌套类。但是我试过了,让我惊讶的是,它是有效的。@tkopec,你为什么不编辑你的答案来更正你的陈述呢?这会给你两分,给我一分。我觉得它很奇怪,尤其是因为你现在知道它是错的。@tkopec,我相信人们仍然可以理智地阅读它。由于您回答了这些评论,他们将看到您编辑了答案。他们还可以查阅答案的历史记录并查阅早期版本。我相信这总比仅仅为了直接参考当前文本而保留错误答案要好。谢谢你让它更清楚。这篇文章已经上了电子天堂,但是由archive.org提供,可以访问。