2009-09-28 88 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