| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1096 人关注过本帖
标题:[求助]Singleton Pattern类定义中,析构函数为什么定义成虚函数?
只看楼主 加入收藏
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
 问题点数:0 回复次数:8 
[求助]Singleton Pattern类定义中,析构函数为什么定义成虚函数?
<<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();
};
搜索更多相关主题的帖子: Singleton Pattern 成虚 函数 定义 
2006-09-19 17:07
yvtianzll
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-9-13
收藏
得分:0 
http://www.
2006-09-19 18:21
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
不错的一篇文章,让人很是理解

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-09-19 21:04
corrupt
Rank: 2
等 级:新手上路
威 望:3
帖 子:535
专家分:0
注 册:2004-9-29
收藏
得分:0 
<<Design Pattern>> 一直都没看过呢...
不过lz 似乎 太急攻了吧,,这个起码的c++继承基础都还没掌握好

2006-09-20 08:21
天使坠落的眼泪
Rank: 2
等 级:新手上路
威 望:5
帖 子:204
专家分:0
注 册:2006-5-16
收藏
得分:0 

把析构函数定义成虚函数,可以有效的防止在之后继承的时候,子类指针的内存泄露.
比如,
class A

class B:public A

A *ptr=new B
在这种情况下调用析构函数的时候,就有可能发生删除了A的空间而没有删除B的空间,
所以将基类定义为抽象类,可以让其子类动态的去调用它自身的函数。


樹欲靜而風不止... http://blog./seablue_xj
2006-09-20 10:19
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 

感谢各位的热情帮助
但只有虚基类才有必要用虚析构函数,这是为了应用"虚基类指针指向派生类对象"这一特性时正确调用各级析构函数.
但在这个类中:
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();
};
只把析构函数定义为虚函数而没有其他虚函数接口,所以我当时觉得没有必要,因为这样的话用"虚基类指针指向派生类对象"就没有多少意义了。


谷底深深行 ,峰顶漫漫步......@_@
2006-09-20 12:08
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
如果是基类,就应该这样定义,我是从那篇文章这样理解的。

这和基类有没有虚函数没关系,只是为了避免内存泄漏

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-09-20 12:12
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
不过从使用类库的用户来说,用虚析构函数更安全,这是我当初没有考虑到的,真的很感谢各位的提醒与指导!谢谢!

谷底深深行 ,峰顶漫漫步......@_@
2006-09-20 12:14
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
就如程序中的注释写的一样
virtual ~CSingletonAutoPtr();
//allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
在基类写virtual destrucotr可以保证基类指针指向衍生类object而被delete时衍生类的destructor被叫到,不写virtual就不会被叫到。

http://myajax95./
2006-09-21 11:41
快速回复:[求助]Singleton Pattern类定义中,析构函数为什么定义成虚函数?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021059 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved