[問題] 可以讓子類別一定會執行某個方法嗎?

看板C_and_CPP作者時間10年前 (2016/01/18 18:35), 10年前編輯推噓6(6025)
留言31則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 以下列連結的程式碼為例, 假設我有一個 ParentClass, 我可以將它設定為 abstract class 來強制每個由它衍生出的子類別都必須實現 SetName(), 但我有辦法確保所 有生成的物件都一定會執行到 SetName() 嗎? 餵入的資料(Input):預期的正確結果(Expected Output): 所以衍生出的子類別都會執行到 SetName() 錯誤結果(Wrong Output): 想不到方法達成目的 程式碼(Code):(請善用置底文網頁, 記得排版) http://ideone.com/hhnsxT 補充說明(Supplement): 2016/1/18 23:01 更換舉例用的程式碼 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.98.137 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1453113359.A.025.html

01/18 19:22, , 1F
寫在 constructor 裡面?
01/18 19:22, 1F

01/18 19:29, , 2F
如果指的是子類別的constructor那可能不行,因為沒有強
01/18 19:29, 2F

01/18 19:30, , 3F
制力, 對方在繼承的時候可以不去做它. 如果寫在父類別
01/18 19:30, 3F

01/18 19:31, , 4F
的constructor裡則會像我註解掉的那行一樣, 發生錯誤.
01/18 19:31, 4F

01/18 20:02, , 5F
轉個彎, 把需要的設定資料往上丟給 constructor 如何?
01/18 20:02, 5F

01/18 20:02, , 6F
(我是指 parent class 的 ctor)
01/18 20:02, 6F

01/18 20:03, , 7F
以此例來說, 反正 gender 在 Parent 就有了
01/18 20:03, 7F

01/18 20:04, , 8F
那就把 "male" 或 "female" 往上丟給 Parent 讓他做事
01/18 20:04, 8F

01/18 20:04, , 9F
(也就是 SetGender 別 virtual 也別給 Child override 了
01/18 20:04, 9F

01/18 20:05, , 10F
把所有東西丟上來給 Parent 解決)
01/18 20:05, 10F

01/18 20:07, , 11F
另外關於你所提的 Error, Effective C++ 有一個項目告誡道
01/18 20:07, 11F

01/18 20:07, , 12F
「永遠不要在建構或解構途中呼叫 virtual 函數」
01/18 20:07, 12F

01/18 20:08, , 13F
簡單原因是建構/解構時 virtual 並不 virtual
01/18 20:08, 13F

01/18 20:09, , 14F
更多請參照 www.artima.com/cppsource/nevercall.html
01/18 20:09, 14F

01/18 20:13, , 15F
To LPH66: 謝謝你給的建議, 這個例子是簡化過的, 事實
01/18 20:13, 15F

01/18 20:14, , 16F
上string中的文字可能有非常多種, 我一時想不出更好的
01/18 20:14, 16F

01/18 20:14, , 17F
舉例方式才簡化成這樣的.
01/18 20:14, 17F

01/18 20:16, , 18F
換個方式想, 如果該函式重要到每個繼承者都要設定
01/18 20:16, 18F

01/18 20:16, , 19F
另外也很感謝你針對 virtual 函數給的提示, 我從未注意
01/18 20:16, 19F

01/18 20:16, , 20F
過這問題.
01/18 20:16, 20F

01/18 20:17, , 21F
那那些「重要的部份」正是可以抽出來寫在 parent 的
01/18 20:17, 21F

01/18 20:17, , 22F
這樣一來 Parent 只需要接收部份子 class 不同的資訊
01/18 20:17, 22F

01/18 20:18, , 23F
即可執行這些重要部份,那就自然變成子 class 透過 parent
01/18 20:18, 23F

01/18 20:18, , 24F
的 ctor call 把不同的資訊往上傳讓 Parent 做事
01/18 20:18, 24F
※ 編輯: icetofux (220.132.98.137), 01/18/2016 21:02:02

01/18 21:17, , 25F
一樣的道理啊, 跟資料是二選一還是 N 選一無關
01/18 21:17, 25F

01/18 21:18, , 26F
重點是把設定程序抽出來寫在 Parent,關鍵資訊再由子 class
01/18 21:18, 26F

01/18 21:18, , 27F
藉 ctor 往上傳上去使用
01/18 21:18, 27F

01/18 21:23, , 28F
大概就像這個樣子 http://ideone.com/5Lhqx8
01/18 21:23, 28F

01/19 00:15, , 29F
謝謝你的範例, 這應該是我要的效果沒錯, 剛剛查了一下
01/19 00:15, 29F

01/19 00:17, , 30F
這種建構後面加冒號的寫法, 感覺好實用, 又多上了一課.
01/19 00:17, 30F

01/19 02:08, , 31F
呃, 這個是建構子初始化成員/父類別的標準寫法啊...
01/19 02:08, 31F
文章代碼(AID): #1MdC0F0b (C_and_CPP)