作者uranusjr (←這人是超級笨蛋)
看板C_and_CPP
標題[問題] Polymorphism 的設計問題
時間Wed Oct 12 04:51:39 2011
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
沒有 C++11 的編譯器
問題(Question):
最近遇到一個設計的問題, 想請問一下有沒有什麼比較好的解決方法
我不太會描述(如果標題不好也麻煩提示一下要怎麼改)
舉個例子來說明好了
https://gist.github.com/1279325
我想讓我的 Controller 完全負責管理 _object 物件的生命週期
可是這個物件有好幾個可能的形態
我把它們的 interface 統一成了一個 (abstract) base class Base
然後讓 ExtendA 或 ExtendB 繼承它, 各自實作繼承來的 pure virtual methods
在 Controller 中就用這個 interface 來使用 _object
上面程式碼中的做法完全可以動
可是很明顯當我呼叫 setObject() 時就會發生 memory leakage
因為 _object 被我 cast 成 Base * 了, 解構式不會釋放 _memberA 或 _memberB
我現在的方法是在 Controller 中存一個 enum 變數, 標記使用的 type 為何
然後在 setObject 中根據這個變數判斷, 把 _object cast 回原本的形態後再刪除
可是這樣整個設計都很詭異, 有點失去多型的意義
更何況如果以後要增加一個 ExtendC ExtendD 等等等的時候...
我知道 template 可以對付這類狀況
可是在實際設計中, Controller 其實是要繼承一個 non-template class
所以我不能把 Controller 設計成 template
不知道有沒有比較有設計經驗的人能為我解釋一下這種問題要怎麼解決
另外我是半途出家的, 對 C++ 的程式架構設計沒什麼瞭解
在 dynamic-binding 語言這根本不存在任何問題
或者像 Java 有 Class 類別也可以輕鬆解決
所以如果這個設計在 C++ 中很蠢也請不要扁我 orz
--
Les grandes et les meilleurs
tone from "Zadok the Priest"
Eine grosse stattliche Veranstaltung
by F. Handel
THE MAIN EVENT! These are the men
Sie sind die Besten
"Champions League" by Tony Britten THESE ARE THE CHAMPIONS!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
推 tomap41017:destructor不是virtual的嗎?這樣還會leak?? 10/12 07:41
→ loveme00835:VC6? 10/12 08:47
推 philip:~Base()會執行啊,從何判斷memory leak的啊@@ 10/12 08:56
推 LPH66:dtor 是 virtual 的 所以會執行到子類別的 dtor 10/12 09:56
→ LPH66:然後子類別的 dtor 的最後一步是呼叫父類別的 dtor 10/12 09:57
→ LPH66:所以一切都沒什麼問題... 10/12 09:57
→ LPH66:你可以在各自的 dtor 加一行印字的程式來驗證 10/12 09:58
→ uranusjr:結果好像是我搞錯了, 是有 leakage 沒錯, 不過不是這個原 10/12 18:03
→ uranusjr:因, 感謝澄清 :q 10/12 18:03