使用虚析构函数的原因

为什么要使用虚析构函数?

 

先来一个我觉得很OK的答案:

         为什么要用虚析构函数? <=> 为什么要多态?

 

然后来一个很易懂的例子:

虚析够函数的目的是为了保证正确的析够函数会被调用,对于需求释放资源的类来说特别重要,比如:
class   CBase
{
pulbic:
    CBase();
    vitrual   ~CBase();
}

class   CDerived   :   public   CBase
{
public:
    CDerived()
    {
          pInt   =   new   int(10);
    }
    ~CDerived()
    {
          delete   pInt;
    }
private:
    int*   pInt;
}
对于上面两个类,如果不将析够函数写为虚函数,则有以下用法的时候就会出问题,资源(pInt)没有被释放:
CBase   pBase   =   new   CDerived;
....
delete   pBase;
原因是由于析够函数不是虚函数,所以delete   pBase的时候,只会调用CBase的析够函数,不会调用CDerived的析够函数。

而如何将析够函数设为虚构函数,则delete   pBase的时候,会首先调用CDerived的析够函数,然后再调用CBase的析够函数。

 

最后来个好像挺好玩的例子:

不过仔细想想,为了充分利用OO的好处以及写代码的便利,你经常还是需要写出那种使用基类指针来持有子类对象的代码,我现在就能想到两个实际中用过的例子:
第一个,比如类似于这种代码:
Shape*   pShapes[]   =   {
        new   Triangle(p1,   p2,   p3),
        new   Rectangle(lt,   rb),
        new   Circle(o,   r)   };

用完了,
for(int   i   =   0;   i   <   sizeof(pShapes)   /   sizeof(*pShapges);   i++)
        delete   pShapes[i];   //通过Shape类型的指针释放不同实际类型的对象。
多爽,呵呵。

还有,有时为了效率考虑,我们不愿不断拷贝对象,这样就经常需要在一个地方动态创建对象,另一个地方消费,第三个地方销毁。这样,每次传递一个指针即可,不会导致大量数据被不停的构造、拷贝。
比方说,假如写一个程序通过网络由服务器定期往客户端发送通知消息,消息分为不同的类型,比如MessageA,   MessageB……,你可以让他们都继承自同一个类:Message,这个类可能只是个抽象类,它有一些基本的GetHead,GetBody,GetTotalLen等方法,以及一个虚拟析构方法。根据实际需要,经常有可能你用一些不同的线程分别来根据不同的用途产生不同的消息,然后插入到一个发送队列,而另外一个独立的线程负责从队列中取出这些消息,发送,并删除消息。这种程序设计结构虽然不符合“谁创建,谁维护,谁销毁”的基本原则,但实际中还是会用到,而且结构也不算乱,因为各个线程的功能很明确,责任很清晰。所以也就不至于“容易产生内存泄漏”。

 

为什么要使用虚析构函数?
因为要实现多态,因为要正确释放资源。

转自技术讨论贴子: http://topic.csdn.net/t/20051229/13/4488434.html

你可能感兴趣的:(C++,虚析构函数)