作者icetofux ()
看板C_and_CPP
标题[问题] 可以让子类别一定会执行某个方法吗?
时间Mon Jan 18 18:35:56 2016
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1453113359.A.025.html
1F:推 CoNsTaR: 写在 constructor 里面? 01/18 19:22
2F:→ icetofux: 如果指的是子类别的constructor那可能不行,因为没有强 01/18 19:29
3F:→ icetofux: 制力, 对方在继承的时候可以不去做它. 如果写在父类别 01/18 19:30
4F:→ icetofux: 的constructor里则会像我注解掉的那行一样, 发生错误. 01/18 19:31
5F:推 LPH66: 转个弯, 把需要的设定资料往上丢给 constructor 如何? 01/18 20:02
6F:→ LPH66: (我是指 parent class 的 ctor) 01/18 20:02
7F:→ LPH66: 以此例来说, 反正 gender 在 Parent 就有了 01/18 20:03
8F:→ LPH66: 那就把 "male" 或 "female" 往上丢给 Parent 让他做事 01/18 20:04
9F:→ LPH66: (也就是 SetGender 别 virtual 也别给 Child override 了 01/18 20:04
10F:→ LPH66: 把所有东西丢上来给 Parent 解决) 01/18 20:05
11F:推 LPH66: 另外关於你所提的 Error, Effective C++ 有一个项目告诫道 01/18 20:07
12F:→ LPH66: 「永远不要在建构或解构途中呼叫 virtual 函数」 01/18 20:07
13F:→ LPH66: 简单原因是建构/解构时 virtual 并不 virtual 01/18 20:08
14F:→ LPH66: 更多请参照 www.artima.com/cppsource/nevercall.html 01/18 20:09
15F:→ icetofux: To LPH66: 谢谢你给的建议, 这个例子是简化过的, 事实 01/18 20:13
16F:→ icetofux: 上string中的文字可能有非常多种, 我一时想不出更好的 01/18 20:14
17F:→ icetofux: 举例方式才简化成这样的. 01/18 20:14
18F:推 LPH66: 换个方式想, 如果该函式重要到每个继承者都要设定 01/18 20:16
19F:→ icetofux: 另外也很感谢你针对 virtual 函数给的提示, 我从未注意 01/18 20:16
20F:→ icetofux: 过这问题. 01/18 20:16
21F:→ LPH66: 那那些「重要的部份」正是可以抽出来写在 parent 的 01/18 20:17
22F:→ LPH66: 这样一来 Parent 只需要接收部份子 class 不同的资讯 01/18 20:17
23F:→ LPH66: 即可执行这些重要部份,那就自然变成子 class 透过 parent 01/18 20:18
24F:→ LPH66: 的 ctor call 把不同的资讯往上传让 Parent 做事 01/18 20:18
※ 编辑: icetofux (220.132.98.137), 01/18/2016 21:02:02
25F:→ LPH66: 一样的道理啊, 跟资料是二选一还是 N 选一无关 01/18 21:17
26F:→ LPH66: 重点是把设定程序抽出来写在 Parent,关键资讯再由子 class 01/18 21:18
27F:→ LPH66: 藉 ctor 往上传上去使用 01/18 21:18
29F:→ icetofux: 谢谢你的范例, 这应该是我要的效果没错, 刚刚查了一下 01/19 00:15
30F:→ icetofux: 这种建构後面加冒号的写法, 感觉好实用, 又多上了一课. 01/19 00:17
31F:推 LPH66: 呃, 这个是建构子初始化成员/父类别的标准写法啊... 01/19 02:08