[問題] 哪種轉型比較危險??

看板C_and_CPP作者 (改)時間12年前 (2012/01/07 17:40), 編輯推噓4(408)
留言12則, 6人參與, 最新討論串1/1
在深入淺出MFC中提到: 「... upcasting(向上強制轉型),將會造成物件的內容被切割(object slicing),... ....."upcasting" 並不是慣用的動作,應該小心,甚至避免。」 但是在這裡 http://topic.csdn.net/t/20030523/20/1826128.html 卻提到: class Base { public: int i; }; class Dervied : public Base { public: int j; }; void f(Base b) { } void h(Dervied d) { } int main() { Derived d; f(d); //這裡是upcast, d必定是Base的物件, 所以它是安全的 Base b; h(static_cast <Dervied> (b)); //這裡是downcast, // 一個Base的物件並不一定是Derived的物件, // 所以他是危險的 } 到底upcast比較危險還是downcast呢?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.240.139.164

01/07 17:46, , 1F
Upcasting should be avoided, but downcasting is worse
01/07 17:46, 1F

01/07 17:47, , 2F
話說回來你引的兩段其實邏輯上也沒衝突 =p
01/07 17:47, 2F

01/07 17:55, , 3F
upcast很正常,為什麼要避免?
01/07 17:55, 3F

01/07 18:02, , 4F
會不會是因為造成物件的內容被切割(object slicing)
01/07 18:02, 4F

01/07 18:03, , 5F
所以upcast需要避免??
01/07 18:03, 5F

01/07 18:14, , 6F
物件切割的起因是多重繼承
01/07 18:14, 6F

01/07 18:24, , 7F
upcasting會造成的問題通常compiler都會抓出來
01/07 18:24, 7F

01/08 12:50, , 8F
兩種狀況都有潛在問題 不過重點是你在使用要清楚這些狀
01/08 12:50, 8F
依個人理解,這兩種狀況的問題在於: upcasting造成object slice, downcasting後,使用原本base class中不存在的function會出問題, 是這樣麼?? ※ 編輯: pracinverse 來自: 111.240.137.5 (01/08 21:59)

01/09 02:07, , 9F
用pass by reference阿,用pass by value你這個容易出包
01/09 02:07, 9F

01/09 02:09, , 10F
用繼承通常是搭傳參,繼承還用傳值,真的等死
01/09 02:09, 10F

01/09 02:09, , 11F
傳指標也行啦
01/09 02:09, 11F

01/09 02:10, , 12F
你的寫法會引發物件複製,當然就會有物件切割的問題
01/09 02:10, 12F
文章代碼(AID): #1F21Bzt0 (C_and_CPP)