设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1040|回复: 8
打印 上一主题 下一主题

[求助]Singleton Pattern类定义中,析构函数为什么定义成虚函数?

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-4 00:02:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<<Design Pattern>> 一书中,Singleton Pattern类定义时把析构函数写成虚函数,析构函数为什么要是虚函数?
总是想不明白,各位仁兄能解释一下吗?

下面是Singleton Pattern的类定义,

class CSingletonAutoPtr
{
private:
static auto_ptr<CSingletonAutoPtr> m_auto_ptr;
static CSingletonAutoPtr* m_instance;
protected:
CSingletonAutoPtr();
CSingletonAutoPtr(const CSingletonAutoPtr&);
virtual ~CSingletonAutoPtr();
//allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
friend class auto_ptr<CSingletonAutoPtr>;
public:
static CSingletonAutoPtr* GetInstance();
void Test();
};
2#
发表于 2009-11-4 00:02:11 | 只看该作者
http://www.ccw.com.cn/htm/app/aprog/01_9_25_2.asp
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-4 00:02:12 | 只看该作者
不错的一篇文章,让人很是理解
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-4 00:02:13 | 只看该作者
<<Design Pattern>> 一直都没看过呢...
不过lz 似乎 太急攻了吧,,这个起码的c++继承基础都还没掌握好
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-4 00:02:15 | 只看该作者
把析构函数定义成虚函数,可以有效的防止在之后继承的时候,子类指针的内存泄露.
比如,
class A
class B:public A
A *ptr=new B
在这种情况下调用析构函数的时候,就有可能发生删除了A的空间而没有删除B的空间,
所以将基类定义为抽象类,可以让其子类动态的去调用它自身的函数。
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-4 00:02:16 | 只看该作者
感谢各位的热情帮助
但只有虚基类才有必要用虚析构函数,这是为了应用"虚基类指针指向派生类对象"这一特性时正确调用各级析构函数.
但在这个类中:
class CSingletonAutoPtr
{
private:
static auto_ptr<CSingletonAutoPtr> m_auto_ptr;
static CSingletonAutoPtr* m_instance;
protected:
CSingletonAutoPtr();
CSingletonAutoPtr(const CSingletonAutoPtr&);
virtual ~CSingletonAutoPtr();
//allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
friend class auto_ptr<CSingletonAutoPtr>;
public:
static CSingletonAutoPtr* GetInstance();
void Test();
};
只把析构函数定义为虚函数而没有其他虚函数接口,所以我当时觉得没有必要,因为这样的话用"虚基类指针指向派生类对象"就没有多少意义了。
回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2009-11-4 00:02:17 | 只看该作者
如果是基类,就应该这样定义,我是从那篇文章这样理解的。

这和基类有没有虚函数没关系,只是为了避免内存泄漏
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-4 00:02:18 | 只看该作者
不过从使用类库的用户来说,用虚析构函数更安全,这是我当初没有考虑到的,真的很感谢各位的提醒与指导!谢谢!
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-4 00:02:19 | 只看该作者
就如程序中的注释写的一样
virtual ~CSingletonAutoPtr();
//allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
在基类写virtual destrucotr可以保证基类指针指向衍生类object而被delete时衍生类的destructor被叫到,不写virtual就不会被叫到。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 20:27 , Processed in 0.109825 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表