本文主要是介绍虚析构函数与析构函数的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先看下面代码:
class A
{
public:
A()
{
printf("A()");
}
virtual ~A()
{
testOutput();
printf("~A()");
}
virtual testOutput()
{
printf("testA");
}
};
class B: public A
{
public:
B()
{
printf("B()");
}
virtual ~B()
{
printf("~B()");
}
virtual testOutput()
{
printf("testB");
}
};
在main函数添加如下:
A* pObj = new B();
delete pObj;
运行结果是:
A()B()~B()testA~A()。
如果改为如下:
class A
{
public:
A()
{
printf("A()");
}
~A()
{
testOutput();
printf("~A()");
}
virtual testOutput()
{
printf("testA");
}
};
class B: public A
{
public:
B()
{
printf("B()");
}
~B()
{
printf("~B()");
}
virtual testOutput()
{
printf("testB");
}
};
则运行结果是:
A()B()testA~A()。
比较2次的结果A()B()~B()testA~A()和A()B()testA~A():
1)就是一个在析构的时候执行了子类的析构函数,一个在析构的时候没有执行子类的函数。
换句话说当加了virtual 后,就会先执行子类的析构函数,再执行基类的析构函数。
2)不执行析构函数,就可能会存在内存泄露。
很明显,不加virtual的情况下,子类的析构函数没有执行。
什么情况下用virtual析构函数呢?
个人理解是,C++的特性之一就是多态,当需要用一个基类的指针new子类的对象的时候,在这种情况下,构造的时候基类和子类都有,所以析构的时候,也应该都需要,所以要加上virtual。
转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/11661163
这篇关于虚析构函数与析构函数的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!