C++多态为什么要定义虚析构函数
2017-07-13 20:47
204 查看
请看父类Base类没有定义虚析构函数的例子:
#include <iostream>
class Base
{
public:
virtual int start()
{
std::cout<<"Base::start"<<std::endl;
}
~Base()
{
std::cout<<"Base::~Base() "<<std::endl;
}
};
class Derived : public Base
{
public:
virtual int start()
{
m_pInt = new int [10];
std::cout<<"Derived::start()"<<std::endl;
}
~Derived()
{
std::cout<<"Derived::~Derived()"<<std::endl;
if(NULL != m_pInt)
{
delete m_pInt;
m_pInt = NULL;
}
}
private:
int *m_pInt;
};
int main()
{
Base *pBase = new Derived();
pBase->start();
delete pBase;
pBase = NULL;
return 0;
}
执行结果
对不起,使用基类指向派生类,释放类对象时,没有执行到Derived类的析构函数,使得Derived类申请有堆内存或者申请有资源的情况,会造成内存泄漏或资源泄漏。
解决方法: 基类的析构函数定义为虚析构函数,这样的使用基类指向派生类,删除基类指针时,能执行到Derived类的析构函数。
#include <iostream>
class Base
{
public:
virtual int start()
{
std::cout<<"Base::start"<<std::endl;
}
~Base()
{
std::cout<<"Base::~Base() "<<std::endl;
}
};
class Derived : public Base
{
public:
virtual int start()
{
m_pInt = new int [10];
std::cout<<"Derived::start()"<<std::endl;
}
~Derived()
{
std::cout<<"Derived::~Derived()"<<std::endl;
if(NULL != m_pInt)
{
delete m_pInt;
m_pInt = NULL;
}
}
private:
int *m_pInt;
};
int main()
{
Base *pBase = new Derived();
pBase->start();
delete pBase;
pBase = NULL;
return 0;
}
执行结果
对不起,使用基类指向派生类,释放类对象时,没有执行到Derived类的析构函数,使得Derived类申请有堆内存或者申请有资源的情况,会造成内存泄漏或资源泄漏。
解决方法: 基类的析构函数定义为虚析构函数,这样的使用基类指向派生类,删除基类指针时,能执行到Derived类的析构函数。
#include <iostream> class Base { public: virtual int start() { std::cout<<"Base::start"<<std::endl; } virtual ~Base() { std::cout<<"Base::~Base() "<<std::endl; } }; class Derived : public Base { public: virtual int start() { m_pInt = new int [10]; std::cout<<"Derived::start()"<<std::endl; } virtual ~Derived() { std::cout<<"Derived::~Derived()"<<std::endl; if(NULL != m_pInt) { delete m_pInt; m_pInt = NULL; } } private: int *m_pInt; }; int main() { Base *pBase = new Derived(); pBase->start(); delete pBase; pBase = NULL; return 0; }
相关文章推荐
- C++学习笔记-----存在多态调用时,为基类定义虚析构函数
- C++为什么需要定义自己的复制构造函数
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++为什么需要定义自己的复制构造函数
- 在c++中,静态数据成员可以被非静态成员函数调用吗?如果可以调用的话那为什么还要定义静态成员函数呢
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C++中inline函数的定义为什么要放在头文件中?头文件中“只定义一份”是什么意思?const object 和inline函数是“一次定义规则”
- 虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- C++中为什么要用虚函数、指针或引用才能实现多态?
- c++中静态成员变量为什么要在类外部再定义?
- 为什么用C++写库 但是导出接口时 却定义了C的接口(李大哥告诉我的,我还没有理解,先记着吧。为以后查询方便,哈哈)
- C++ 类的定义问题,为什么只有const static 整型变量才可以在类中定义并复赋值?
- C++中基类的析构函数为什么要用virtual虚析构函数
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 从内存上解析c++中数组为什么不支持多态
- C++中为什么需要多态
- C++ 虚函数、多态、为什么需要虚拟析构函数
- 为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?
- C++: 为什么我们一般都要将函数的声明和定义分开?(separate the declaration of function from its definition)
- C++静态成员变量为什么在类外部定义?