爲什麼下面的繼承結構在C++中不合法?從派生自同一類的類派生的C++子類
- SON1從Father1派生
- Son2從Father1派生
- GrandSon1從SON1和Son2派生
如果有可能的情況下,這是合法的(也許如果所有的類都是純鐵虛擬除了GrandSon1),它們是什麼以及怎麼來的?
爲什麼下面的繼承結構在C++中不合法?從派生自同一類的類派生的C++子類
如果有可能的情況下,這是合法的(也許如果所有的類都是純鐵虛擬除了GrandSon1),它們是什麼以及怎麼來的?
你錯了,這在C++中是完全合法的。不過你可以看看virtual inheritance。
這是C++鑽石問題。
這個繼承層次稱爲diamond of death並在C是合法++如果你使用虛擬繼承,但它通常是仍是個問題。
這個答案使C++編程聽起來非常危險。 – 2011-01-05 14:11:32
@Space:C++ *是非常危險的。 – 2011-01-05 14:15:14
我覺得你是令人困惑的類層次結構和類實例。
一個「孫子」類可以從一個「兒子」類派生的,而是一個「孫子」的實例不能從類「兒子」
在任何情況下2個實例,我覺得你不應該這樣做,因爲在某些時候,你會有一個「孫子孫」班和一個「孫中山孫」班。
以另一種方式建立父母和兄弟姐妹之間的關係。
-1:我認爲你使C++與一種不支持多繼承的語言混淆。 – 2011-01-05 14:13:14
@ Space_C0wb0y:請確保您不會將C++混淆爲支持它的語言*正確* – 2011-01-05 14:19:42
也許我在原始問題的措辭中感到困惑。 父親與基地,兒子與派生... – Max 2011-01-05 14:29:58
這是典型的繼承鑽石。它甚至發生在iostream從istream和ostream中派生的標準庫中,並且這兩個派生自ios_base。
有各種問題:
如果父親有一個虛擬的方法和SON1和Son2都實現它,除非孫子實現它也有陳述其SON1它實現Son2的方法。
如果父親有任何數據成員,孫子會讓他們兩次。
在任何情況下,父親有一個V - 表,所以你似乎得到2份副本。
因此,中間類通常使用虛擬繼承,這很棘手,但實際上意味着只有最終的類獲得基類。因此,在這種情況下,孫子本身負責構建父親,並被假定爲「擁有」父親。
還有其他問題要注意,如果你要投任何指針。特別要注意鑄造空出來*。
你說的「不合法」是什麼意思? – Jon 2011-01-05 14:04:15
爲什麼它不合法?請參閱:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8(25.8和25。9) – badgerr 2011-01-05 14:05:54
非法'兒子'=='混蛋'? – 2011-01-05 14:07:37