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

作者: icetofux   2016-01-18 18:35:56
開發平台(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 更換舉例用的程式碼
作者: CoNsTaR ((const *))   2016-01-18 19:22:00
寫在 constructor 裡面?
作者: icetofux   2016-01-18 19:29:00
如果指的是子類別的constructor那可能不行,因為沒有強制力, 對方在繼承的時候可以不去做它. 如果寫在父類別的constructor裡則會像我註解掉的那行一樣, 發生錯誤.
作者: LPH66 (-6.2598534e+18f)   2016-01-18 20:02:00
轉個彎, 把需要的設定資料往上丟給 constructor 如何?(我是指 parent class 的 ctor)以此例來說, 反正 gender 在 Parent 就有了那就把 "male" 或 "female" 往上丟給 Parent 讓他做事(也就是 SetGender 別 virtual 也別給 Child override 了把所有東西丟上來給 Parent 解決)另外關於你所提的 Error, Effective C++ 有一個項目告誡道「永遠不要在建構或解構途中呼叫 virtual 函數」簡單原因是建構/解構時 virtual 並不 virtual更多請參照 www.artima.com/cppsource/nevercall.html
作者: icetofux   2016-01-18 20:13:00
To LPH66: 謝謝你給的建議, 這個例子是簡化過的, 事實上string中的文字可能有非常多種, 我一時想不出更好的舉例方式才簡化成這樣的.
作者: LPH66 (-6.2598534e+18f)   2016-01-18 20:16:00
換個方式想, 如果該函式重要到每個繼承者都要設定
作者: icetofux   2016-01-18 20:16:00
另外也很感謝你針對 virtual 函數給的提示, 我從未注意過這問題.
作者: LPH66 (-6.2598534e+18f)   2016-01-18 20:17:00
那那些「重要的部份」正是可以抽出來寫在 parent 的這樣一來 Parent 只需要接收部份子 class 不同的資訊即可執行這些重要部份,那就自然變成子 class 透過 parent的 ctor call 把不同的資訊往上傳讓 Parent 做事一樣的道理啊, 跟資料是二選一還是 N 選一無關重點是把設定程序抽出來寫在 Parent,關鍵資訊再由子 class藉 ctor 往上傳上去使用大概就像這個樣子 http://ideone.com/5Lhqx8
作者: icetofux   2016-01-19 00:15:00
謝謝你的範例, 這應該是我要的效果沒錯, 剛剛查了一下這種建構後面加冒號的寫法, 感覺好實用, 又多上了一課.
作者: LPH66 (-6.2598534e+18f)   2016-01-19 02:08:00
呃, 這個是建構子初始化成員/父類別的標準寫法啊...

Links booklink

Contact Us: admin [ a t ] ucptt.com