推 littleshan:你的疑慮是對的,這樣做會爆炸 06/06 21:08
→ littleshan:請見 more effective c++ 條款3 06/06 21:08
那請問一下如果想做類似case 1 的處理(把子類別陣列丟到某東西處理)
要怎麼寫比較方便
我知道可以用雙重指標 不過這樣寫還是不太直觀
※ 編輯: whoowh 來自: 114.34.216.47 (06/06 22:10)
推 littleshan:boost::ptr_vector 06/06 22:12
請問是類似這樣的作法嗎...?
http://davidlwq.iteye.com/blog/1127797
→ poyenc:想請問你為什麼會有這種需求, 硬要透過父類別指標, 來存取 06/06 22:19
→ poyenc:可以繼承下去給子類的介面 06/06 22:20
要詳細解釋可能可以這樣說:
父類別是水果
然後子類別是蘋果
然後接下我希望在某個類別可以寫
"一次處理一大串水果的函數" 所以定義了水果指標
然後丟一個蘋果陣列進去讓他處理 可是會有問題就不知道要怎麼辦這樣
如果只針對蘋果做處理那當然OK 不過這樣就不夠廣義 有點頭痛~"~
→ diabloevagto:用interface如何 06/07 00:46
想請問這邊怎麼做
→ legnaleurc:他的重點是陣列存指標會混淆多型的 offset 06/07 00:51
※ 編輯: whoowh 來自: 114.34.216.47 (06/07 01:51)
※ 編輯: whoowh 來自: 114.34.216.47 (06/07 01:52)
※ 編輯: whoowh 來自: 114.34.216.47 (06/07 02:11)
這樣好像會run time error 我猜轉成最基底的話編譯器不知道陣列的offset多大..
※ 編輯: whoowh 來自: 60.248.183.2 (06/07 10:03)
推 hichcock:虛擬函式呢?? 06/07 10:24
→ hichcock:virtual function 不就是為了這種情況而出現的嗎 06/07 10:25
→ james732:唔,我的範例是可以的,為什麼你的不行我就不懂了 06/07 10:35
→ loveme00835:因為 james 的物件大小剛好都一樣 06/07 11:12
→ james732:咦咦,原來會有這樣的問題 06/07 11:36
推 LPH66:這跟虛擬函式沒有關係 是元素 offset 的問題 06/07 12:27
→ LPH66:如果建一個陣列內含所有元素的"Base*"指標如何? 06/07 12:28
→ LPH66:(這個其實是 java 的做法的概念就是了) 06/07 12:29
是說像這樣嗎
我現在的作法是
Base** pDataArray;
pDataArray = new Base*[numOfObjects];
要用物件的時候
pDataArray[i]->getA();
^^^^^^^^^^^^^這個指標可以拿來指derived物件
不過總覺得很不直觀....
※ 編輯: whoowh 來自: 210.66.52.167 (06/07 12:34)
※ 編輯: whoowh 來自: 210.66.52.167 (06/07 12:35)
→ james732:我終於看懂這個問題了...XD 06/07 12:41
推 LPH66:差不多是這樣沒錯 不直觀個人覺得是指標語法的問題... 06/07 12:41
推 chchwy:不太懂哪裡不直觀,這不才是正常用法嗎XDDDD 06/07 12:50
→ loveme00835:你所謂的"直觀"實際上是對語意上的誤解, Derived is a 06/07 13:14
→ loveme00835:Base 物件, 但 Derviced '物件陣列' is not a Base 06/07 13:14
→ loveme00835:'物件陣列', 再來就是對陣列做 [] 取值行為, 則是假設 06/07 13:15
→ loveme00835:該處有 Base 物件存在, 但跟你講的水果意義上差別很大 06/07 13:15
→ loveme00835:沒有'水果'這種東西, 但是有香蕉、蘋果等屬於'水果'的 06/07 13:16
→ loveme00835:物品, 所以'水果'該是interface或是abstract class 06/07 13:17
→ loveme00835:想當然爾用 [] 取值的行為就是不合法的, 因為這種物件 06/07 13:17
→ loveme00835:無法被建構出來, 不想間接取值的話你用 ptr_vector 06/07 13:19
→ loveme00835:不過如果在 Set 類別不消存有 Base* 成員, run1、run2 06/07 13:20
→ loveme00835:用 template function 就可以作掉了 06/07 13:21
推 hichcock:按照 "你希望" 的描述方式...你要看看如何正確使用 06/07 13:21
→ hichcock:virtual function 比較好 06/07 13:21
→ loveme00835:再噁心一點就用 boost::any XD 06/07 13:24
→ loveme00835:但是你 new 的地方都寫死了, 那存 void* 就好, run1 06/07 13:26
→ loveme00835:呼叫時再透過模板引數指定型別即可 06/07 13:27
→ linotwo:set 用來存指標 06/07 13:36
→ linotwo:物件本身則存在陣列裡或是用 new 的 06/07 13:37