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

时间:2009-09-28 08:31:57

标签: c++ inheritance nested-class

我正在尝试执行以下操作:

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

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

...但是我的编译器似乎对此嗤之以鼻。这是合法的C ++,如果没有,是否有更好的方法来完成同样的事情?基本上,我想创建一个更清晰的类命名方案。 (我不想从公共基类派生Animal和内部类)

5 个答案:

答案 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和颠倒传承......”