2009-09-28 85 views
17

我试图做到以下几点:嵌套的C++类是否可以继承它的封闭类?

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

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

...但我的编译器出现呛到这一点。这是合法的C++,如果没有,是否有更好的方法来完成同样的事情?本质上,我想创建一个更清洁的类命名方案。 (我不想从派生的Animal和内部类从一个共同的基类)

+2

一开始,你需要遵循分号结束括号类声明之后。 –

+0

我不清楚你为什么要这样做。如果我理解正确,熊类将在其中有一个熊类,这似乎有点奇怪。 –

回答

37

你可以做你想做的事,但你必须延迟嵌套类的定义。

class Animal 
{ 
    class Bear; 
    class Giraffe; 
}; 

class Animal::Bear : public Animal {}; 

class Animal::Giraffe : public Animal {}; 
2

没有真正回答这个问题,但我认为你滥用嵌套类,也许你应该看看命名空间(顺便说一句,答案是“这是不可能的,因为动物是一种不完整的类型”)。

15

类类型被视为不完整,直到达到其定义的末尾。你不能继承不完整的类,所以你不能从封装类继承。

编辑:修正
正如理查德沃尔夫纠正说:这是可以从如果延误嵌套类的定义包含类继承。详情请见他的回答。

+1

可以通过转发声明所包含的类。 –

+1

我不知道它允许在封闭类之外定义嵌套类。但尝试,令人惊讶的是,它的工作原理。 –

+0

@tkopec,你为什么不编辑你的答案来纠正你的陈述?它会给你你的两分,而我是我的一分。我觉得很奇怪,尤其是因为你知道现在是错的。 –

2

我不清楚你在这里想达到什么,但你可能能够通过命名空间得到它。

namespace creatures 
{ 

class Animal 
{ 
}; 

class Bear : public Animal 
{ 
}; 

class Giraffe : public Animal 
{ 
}; 


} 

这声明熊和长颈鹿的种类的动物,但把整个事情的命名空间,如果你正在寻找的基类不污染全局命名空间。

0

总是值得考虑ATL方法的“颠倒继承”。每当我需要这样做时,它都会让我头痛,但是您获得的对象代码的效率是无与伦比的。在某处我剪下了Jim Beveridge的文章,这是我见过的最好的解释,但今天很难找到,我只看到它的一个参考。

“2004年3月25日...由吉姆·贝弗里奇一个优秀的文章:ATL和倒立继承。”

+0

文章已经上传到天堂,但是可以访问http://.org.archive.org/web/20070805214320/http://apostate.com/programming/atlupsidedown.html。 – ndkrempel