C_and_CPP 板


LINE

※ 引述《yoco315 (眠月)》之铭言: : 不要 = =" : 既然资源是在 D 配的,D 要自己处理,不要给 B 管 : 所以这边改成这样 : virtual ~Base() {} // 虾米都不做 : : class Derived { : : virtual void doClose() { : : // ... : : } : 然後 D 加上解构子 : virtual ~Derived () { // 我自己来 XD : D::doClose(); // ~B() 不能呼叫虚拟函数 : } // 我自己呼叫应该没问题吧??? : 还是我哪边错惹?????????? 如果我的理解没错 原po他希望的是 Derived里面有个function负责relase资源 但是在错误使用(delete 前忘了呼叫close的时侯)能够自动释放 而且重要的是,希望能在Derived的设计者「忘了」在dtor呼叫doClose的时侯 只要是从Base class继承出来的class都能自动的去呼叫doClose 後面这就是重点了 因为Base和Derived的设计者有可能是不同人 可能document没写清楚 又或者单纯忘记了 总之因为种种原因 原po希望能在Base class里就自动的有机制去处理这件事.. 所以现在的问题是:唯一在物件销毁时会自动执行的只有dtor 但是dtor中又不能呼叫virtual function 解决方法也就很直观了..那就是写成两个class 也就是把介面和实作分开来就好了 就像#1Ap2yPNw提到的那样 刚好有个design pattern叫作bridge.. 这有两种写法 动态多型的写法就像前述文章那样 class Base { BaseImpl* pImpl; public: void open() { pImpl->doOpen(); } void close() { pImpl->doClose(); } void someOperation() { pImpl->someOperation(); } ~Base() { content->doClose(); delete pImpl; } } class BaseImpl { friend Base; virtual void doOpen()= 0; virtual void doClose()= 0; void someOperation() {}; } 如此这般 Base只提供一个操作的介面 实际的动作是委托给BaseImpl进行的 这样Derived class只要继承BaseImpl 自然就能成为一个Base的实作体 静态多型的写法是像下面这样 template <typename T> class BaseInterface { T impl; public: void open() { impl._open(); } void close() { impl._close(); } void someOperation() { impl._someOperation(); } ~BaseImpl() { impl._close(); } } class DerviedImpl { //implematation here }; typdef BaseInterface<DerivedImpl> Derived; 静态多型的方法可以省掉virtual function的呼叫成本 当然缺点就是没办法在run-time改变型别 不过如果以原po的需求:管理资源open和close的class集来说 应该不会要用动态多型..所以後者是比较建议的方法 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.13.219 ※ 编辑: minazukimaya 来自: 114.32.13.219 (10/08 03:06)
1F:推 legnaleurc:没错,我完全就是这个意思 XD 10/08 12:17
2F:→ legnaleurc:不过我的确需要用到动态多型,因为 subclasses 的部分 10/08 12:18
3F:→ legnaleurc:是用 plugins 的方式 dynamic load 进来 10/08 12:18
4F:→ legnaleurc:看来必须要考虑是否值得为了这个举动增加class的复杂度 10/08 12:19







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP