看板 C_and_CPP 關於我們 聯絡資訊
在深入淺出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
uranusjr:Upcasting should be avoided, but downcasting is worse 01/07 17:46
uranusjr:話說回來你引的兩段其實邏輯上也沒衝突 =p 01/07 17:47
littleshan:upcast很正常,為什麼要避免? 01/07 17:55
pracinverse:會不會是因為造成物件的內容被切割(object slicing) 01/07 18:02
pracinverse:所以upcast需要避免?? 01/07 18:03
littleshan:物件切割的起因是多重繼承 01/07 18:14
shadow0326:upcasting會造成的問題通常compiler都會抓出來 01/07 18:24
saberstar:兩種狀況都有潛在問題 不過重點是你在使用要清楚這些狀 01/08 12:50
依個人理解,這兩種狀況的問題在於: upcasting造成object slice, downcasting後,使用原本base class中不存在的function會出問題, 是這樣麼?? ※ 編輯: pracinverse 來自: 111.240.137.5 (01/08 21:59)
cgcheng:用pass by reference阿,用pass by value你這個容易出包 01/09 02:07
cgcheng:用繼承通常是搭傳參,繼承還用傳值,真的等死 01/09 02:09
cgcheng:傳指標也行啦 01/09 02:09
cgcheng:你的寫法會引發物件複製,當然就會有物件切割的問題 01/09 02:10