[問題] 一個設計上的問題(virtual function)

看板C_and_CPP作者 (fish)時間11年前 (2012/12/15 20:10), 編輯推噓2(206)
留言8則, 2人參與, 最新討論串1/3 (看更多)
我在程式中宣告了一個 base class 的 pointer object,礙於有時候我想用該 object 去 call subclass 專屬的 funciton 時要強制轉型才能達成(如以下ex),這會造成我的程 式碼又長又醜(若命名長一點的話...) ex. RD 與 PM 繼承 Employee Employee* A; (RD*)A->get_RD(); (PM*)A->get_PM(); 所以我想把該 function 變成 virtual 去實做,但是又遇到以下幾個問題...... 我在 base class 設定一個 pure virtual funciton,但是這個 function 並不是所有的 sub class 都會實做到,如果該 pure virtual funciton 沒有被底下每一個 sub class 實做到的時候,沒實做到該 funciton 的 sub class 在 compile 時會出現 error: cannot allocate an object of abstract type...... 又,如果我不將該 virtual funciton 設成 pure,那麼在 base class 就必須實作它, 可是這樣就會違背原本設計想法的意義(該 function 明明就是只有 sub class 才用得 到,為什麼一定要我在 base class 中去實做它),如果實做了裡面不做事還 ok,但是 遇到那種 get data 類型的 function,必須回傳一個東西,我又不知道該怎麼辦才好了 ...... 是否最前者就是比較好的方法了呢? 又或者有沒有其他更好的設計? 謝謝大家!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.142.132 ※ 編輯: rabbit0321 來自: 114.42.142.132 (12/15 20:14)

12/16 11:53, , 1F
可以將derived的專屬函式進一步抽象化,例如以下兩個函式:
12/16 11:53, 1F

12/16 11:55, , 2F
void RD::coding(); void PM::manage(); 用work()來概括:
12/16 11:55, 2F

12/16 11:57, , 3F
virtual void Employee::work() = 0;
12/16 11:57, 3F

12/16 11:58, , 4F
void RD::work() { ... coding(); ... } 也就是說將設計
12/16 11:58, 4F

12/16 11:59, , 5F
改成不需要直接使用derived的專屬函式
12/16 11:59, 5F

12/16 22:43, , 6F
http://codepad.org/0QRicfz 把 dirty code 集中到一個函式
12/16 22:43, 6F

12/16 22:44, , 7F
但如果 derived class 很多的話可能會有效能疑慮@@
12/16 22:44, 7F

12/16 22:46, , 8F
link 貼錯了^^" http://codepad.org/0QRicfzm
12/16 22:46, 8F
文章代碼(AID): #1Gp6Z8t- (C_and_CPP)
文章代碼(AID): #1Gp6Z8t- (C_and_CPP)