[问题] 可以让子类别一定会执行某个方法吗?

楼主: 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