虚析构函数的问题...

来源:百度知道 编辑:UC知道 时间:2024/06/01 21:13:23
14.程序改错
class mml
{
private:
static unsigned int x;
public:
mml(){ x++; }
mml(static unsigned int &) {x++;}
~mml{x--;}
pulic:
virtual mon() {} = 0;
static unsigned int mmc(){return x;}
......

};
class nnl:public mml
{
private:
static unsigned int y;
public:
nnl(){ x++; }
nnl(static unsigned int &) {x++;}
~nnl{x--;}
public:
virtual mon() {};
static unsigned int nnc(){return y;}
......
};

代码片断:
mml* pp = new nnl;
..........
delete pp;

A:
基类的析构函数应该为虚函数
virtual ~mml{x--;}

为什麽将基类的析构函数改为虚析构函数? 书上讲一点虚析构函数的内容,对这点我一直迷糊....

www.bysj580.cn
QQ:820332620

简单的说。意思就是说:如果你不声明为virtual的话,而你又声明为mml*类型指针,那么,delete 的时候,只能delete掉mml类型所拥有的对象部分,而你实际new 出来的对象就delete不掉了。这样就会出现对象切割。
如果声明为virtual的,就可以认识到是个nnl类型。

从函数角度说,如果基类函数加了修饰符virtual,那么派生类可以加也可以不加,效果是一样的
但是如果基类函数没有修饰符(普通类型函数),那么派生类中将不能将此同名函数声明为虚函数

用途的话一般就是调用的时候系统会尽量寻找派生层次最高的那个
比如基类为A,B派生于A,C派生于B,如果A类中函数func为虚,那么
A* a = new C(); a->func();将会调用C类中对应的func(要在此类中给此函数定义)