2014-09-25 95 views
0

警告:這是不是一個What is object slicing?重複,我已經讀過它,它沒有說明我的問題複製構造函數缺少與對象切片有關嗎?


我的問題是:爲什麼是缺乏一個拷貝構造函數的基本問題關於對象切片的課程?如果我做類似

Base base; 
Derived derived; 

Base newbaseobj((Base)derived); 

這是一個經典的切片問題!我不明白爲什麼或如何定義在基本用戶定義的拷貝構造函數將有助於

編輯:我問這是因爲這些問題的答案:https://stackoverflow.com/a/26040064/1938163https://stackoverflow.com/a/26040050/1938163似乎暗示我需要定義/默認副本構造函數來處理對象切片

+1

我不確定這個問題是否實際上是重複的,但如果切片是實際問題,那麼鏈接的問題應該有所幫助。關於析構函數/複製構造函數/賦值運算符:這稱爲「三項規則」,不是關於分片,而是關於資源(主要是指針)處理。 – stefaanv 2014-09-25 14:39:22

+0

這不是重複的,絕對不會回答我的問題! – Dean 2014-09-25 14:43:05

+0

你的意思是禁用/刪除複製構造函數等? – 2014-09-25 14:54:25

回答

2

重新

爲什麼是缺乏一個拷貝構造函數的基類對象有關切片

它的一個問題一般情況下,

用戶定義的複製構造可以幫助防止切片由不可訪問,從而防止拷貝初始化(全身鎧甲需要那麼也馭拷貝賦值的),或(不這樣做),它可以動態檢測切片,對於多態類型,並且在那種情況下允許通用複製。

但是一個可訪問的普通拷貝構造函數不支持’防止切片。它最多可以幫助檢測調試中的複製操作。

+0

這個人寫的是錯的嗎? http://stackoverflow.com/a/26040064/1938163通過閱讀它,在我看來,複製構造函數應該默認/定義只是爲了處理對象切片 – Dean 2014-09-25 15:17:29

+0

@ user3834459:這不是它所說的。它說「默認生成的很可能不適合」,「你應該只是禁止它」,「我想你可能會保護它」。 – 2014-09-25 15:20:39

+0

@ user3834459:不,據我所知,好機器人寫的是正確的。他沒有寫複製構造函數應該被默認/定義來處理對象切片。 – 2014-09-25 15:21:27

1

當您的設計中涉及繼承(更具體地說Polymophism)時,對象切片會進入圖片。當您通過值將派生類對象傳遞給期望Base類對象的函數時,將發生切片。無論你自己定義拷貝構造函數還是使用編譯器生成的切片都將以任何方式進行。

指針是解決切片問題的一種方法,在這種情況下,派生到基的傳遞不會創建切片問題(假定涉及多態),並且在涉及指針時不會調用任何類的構造函數。

希望我回答你的疑問......

+0

感謝您的幫助!事實上,除非我採取一些預防措施(例如保護/私密/刪除複製構件),否則對象切片將會發生。 – Dean 2014-09-25 15:35:52

3

我的問題是:爲什麼缺乏複製構造函數在基類中有關對象切片的問題?

這取決於你的意思是「缺乏」。

如果真的沒有拷貝構造函數,那麼沒有問題:基類不能被複制,因此切片不能發生。

如果它沒有聲明一個,可能會有問題;在這種情況下,隱式地生成一個,並且可以用於切片派生類對象。

我不明白爲什麼或如何定義在基本用戶定義的拷貝構造函數將有助於

刪除它會防止複製,因此切片幫助,乾脆。聲明protected只會允許將基類複製爲派生對象的一部分(派生類的成員除外),從而避免了大多數切片情況。