新微赢技术网

标题: [求助]Singleton Pattern类定义中,析构函数为什么定义成虚函数? [打印本页]

作者: 梦aiq逍遥    时间: 2009-11-4 00:02
标题: [求助]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();
};
作者: 冰feng£落叶    时间: 2009-11-4 00:02
http://www.ccw.com.cn/htm/app/aprog/01_9_25_2.asp
作者: ωǒ↘倫↙    时间: 2009-11-4 00:02
不错的一篇文章,让人很是理解
作者: 敬你永远遗忘    时间: 2009-11-4 00:02
<<Design Pattern>> 一直都没看过呢...
不过lz 似乎 太急攻了吧,,这个起码的c++继承基础都还没掌握好
作者: 随chu风liu    时间: 2009-11-4 00:02
把析构函数定义成虚函数,可以有效的防止在之后继承的时候,子类指针的内存泄露.
比如,
class A
class B:public A
A *ptr=new B
在这种情况下调用析构函数的时候,就有可能发生删除了A的空间而没有删除B的空间,
所以将基类定义为抽象类,可以让其子类动态的去调用它自身的函数。
作者: 边走¤边爱    时间: 2009-11-4 00:02
感谢各位的热情帮助
但只有虚基类才有必要用虚析构函数,这是为了应用"虚基类指针指向派生类对象"这一特性时正确调用各级析构函数.
但在这个类中:
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();
};
只把析构函数定义为虚函数而没有其他虚函数接口,所以我当时觉得没有必要,因为这样的话用"虚基类指针指向派生类对象"就没有多少意义了。
作者: 梦aiq逍遥    时间: 2009-11-4 00:02
如果是基类,就应该这样定义,我是从那篇文章这样理解的。

这和基类有没有虚函数没关系,只是为了避免内存泄漏
作者: 顺其自然    时间: 2009-11-4 00:02
不过从使用类库的用户来说,用虚析构函数更安全,这是我当初没有考虑到的,真的很感谢各位的提醒与指导!谢谢!
作者: 香叶aiq格格    时间: 2009-11-4 00:02
就如程序中的注释写的一样
virtual ~CSingletonAutoPtr();
//allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
在基类写virtual destrucotr可以保证基类指针指向衍生类object而被delete时衍生类的destructor被叫到,不写virtual就不会被叫到。




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2