2011-01-05 117 views
1

爲什麼下面的繼承結構在C++中不合法?從派生自同一類的類派生的C++子類

  • SON1從Father1派生
  • Son2從Father1派生
  • GrandSon1從SON1和Son2派生

如果有可能的情況下,這是合法的(也許如果所有的類都是純鐵虛擬除了GrandSon1),它們是什麼以及怎麼來的?

+0

你說的「不合法」是什麼意思? – Jon 2011-01-05 14:04:15

+0

爲什麼它不合法?請參閱:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8(25.8和25。9) – badgerr 2011-01-05 14:05:54

+5

非法'兒子'=='混蛋'? – 2011-01-05 14:07:37

回答

3

這個繼承層次稱爲diamond of death並在C是合法++如果你使用虛擬繼承,但它通常是仍是個問題。

+0

這個答案使C++編程聽起來非常危險。 – 2011-01-05 14:11:32

+3

@Space:C++ *是非常危險的。 – 2011-01-05 14:15:14

-2

我覺得你是令人困惑的類層次結構和類實例。

一個「孫子」類可以從一個「兒子」類派生的,而是一個「孫子」的實例不能從類「兒子」

在任何情況下2個實例,我覺得你不應該這樣做,因爲在某些時候,你會有一個「孫子孫」班和一個「孫中山孫」班。

以另一種方式建立父母和兄弟姐妹之間的關係。

+4

-1:我認爲你使C++與一種不支持多繼承的語言混淆。 – 2011-01-05 14:13:14

+0

@ Space_C0wb0y:請確保您不會將C++混淆爲支持它的語言*正確* – 2011-01-05 14:19:42

+0

也許我在原始問題的措辭中感到困惑。 父親與基地,兒子與派生... – Max 2011-01-05 14:29:58

1

這是典型的繼承鑽石。它甚至發生在iostream從istream和ostream中派生的標準庫中,並且這兩個派生自ios_base。

有各種問題:

  • 如果父親有一個虛擬的方法和SON1和Son2都實現它,除非孫子實現它也有陳述其SON1它實現Son2的方法。

  • 如果父親有任何數據成員,孫子會讓他們兩次。

  • 在任何情況下,父親有一個V - 表,所以你似乎得到2份副本。

因此,中間類通常使用虛擬繼承,這很棘手,但實際上意味着只有最終的類獲得基類。因此,在這種情況下,孫子本身負責構建父親,並被假定爲「擁有」父親。

還有其他問題要注意,如果你要投任何指針。特別要注意鑄造空出來*。