我们首先知道构造函数在对象的生存期内只会被调用一次,并且是由系统来调用,用户不能直接调用。
但我们用户可以直接调用析构函数。
且构造函数和析构函数默认都是采取静态联编的方式。
为什么需要将析构函数定义为虚函数?
通过复制兼容性规则可知,可以使用基类指针指向派生类对象,如果使用基类指针指向动态开辟的派生类对象,由该基类指针撤销派生类对象,则必须将基类析构函数定义为虚函数,实现多态性,自动调用派生类析构函数,否则可能出现内存泄漏问题。
我们通过下面的例子来说明:
1.继承类属性没有指针类型时
问题1:
答案:此时Object类型的指针p调用的是自己类的析构函数
原因:析构函数没有定义为虚函数,此时采用的是静态联编
问题2:
答案:此时没有发生内存泄漏。
原因:我们看下面的图片
2.继承类属性有指针类型时
问题1:
答案:此时Object类型的指针p调用的是自己类的析构函数
原因:析构函数没有定义为虚函数,此时采用的是静态联编
问题2:
答案:此时发生了内存泄漏。
原因:我们看下面的图片
为了防止内存泄漏的产生,我们采取了虚析构函数的方法:
将上述代码改为:
为什么将基类析构函数设置为虚函数就可以防止内存泄漏?
原因:
结论:在实现运行时多态时,将基类析构函数设置为虚析构函数,来避免内存泄漏的产生。