2013-09-29 79 views
1

爲什麼對象切片不發生在私有繼承中?在這種情況下,Static_cast會產生錯誤? 我明白,私有繼承不會在其繼承類之間保持「是 - 一種」關係。這是否與切片有關,因爲派生不是基類型的,因此編譯器強制不進行隱式轉換?私有繼承中的對象切片

+0

顯示一些代碼。將派生類型的對象轉換爲基本類型的對象將對該對象進行分片。這就是切片的意思。 –

回答

3

將派生類切片到其私有基類沒有任何意義。只要考慮一下「私人」的含義。這意味着外部世界不應該關心它。允許切片(鑄造)到私人基地意味着外部世界將會關心。

如果你真的想這樣的行爲(我很想聽聽你的理由),你可以破解它周圍:

class Base { }; 
struct Derived : private Base 
{ 
    Base asBase() { return static_cast<Base>(*this); } 
}; 

這樣,投偏偏內源性,在基地進行訪問。您從static_cast獲得的錯誤是因爲它在Derived的範圍之外使用,其中Base無法訪問。

+0

我想我明白你想說什麼......還有一件事,謝謝你展示了獲得基指針的方式,但它真的需要嗎? –

+1

我沒有展示如何獲得Base _pointer_。 'asBase'函數將Derived對象分割爲一個Base(注意,asBase的返回值是'Base',而不是'Base *'或'Base&',它們都不會分割對象)。總的來說,切片不能從Derived的範圍之外完成,因爲Base是一個私有基礎。這就是爲什麼你需要在Derived範圍內發生切片。希望這可以澄清事情。 – thelamb

+0

好的..現在我明白了你的觀點,謝謝... –