在C++中有这么一句话描述虚析构函数:
当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。
纠结了半天看文字还是有一些不确定和不明白,在网上搜集了一点资料与大家共勉。
析构函数是释放资源,避免“资源泄漏”,更加安全。
对于基类和派生类的对象删除问题,虚析构函数则能够保证对象释放时总是调用“对象自己的函数”。
举个例子就清楚了,比如:
当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。
纠结了半天看文字还是有一些不确定和不明白,在网上搜集了一点资料与大家共勉。
析构函数是释放资源,避免“资源泄漏”,更加安全。
对于基类和派生类的对象删除问题,虚析构函数则能够保证对象释放时总是调用“对象自己的函数”。
举个例子就清楚了,比如:
- Class A
- {
-
…… -
Virtual ~A(){ -
printf(“A::~A()”); -
} -
…… - }
- Class B:public A
- {
-
…… -
Virtual ~B(){ -
printf(“B::~B()”); -
} -
…… - }
- Void main()
- {
-
B *b = new B(); -
A *a = a; -
Delete a; - }
- 上面的代买的执行结果是B::~B()
但是如果类A的西沟函数是非虚函数的话:
上面的代码的执行结果将是A::~A()
很明显析构函数定义为虚函数的作用是为了程序能够调用到正确的析构函数。
析构函数被定义为虚函数是为了确保在继承体系中,通过基类指针删除对象时能正确调用到派生类的析构函数。如示例所示,当基类的析构函数为虚函数时,`delete a;`会执行`B::~B()`,否则只会执行`A::~A()`。这保证了资源的正确释放。

798

被折叠的 条评论
为什么被折叠?



