C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。
如果自己设计的C++类体系中存在继承关系,请注意父子类的析构函数关键字设置。虚函数是在基类中被声明为 virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载。 当一个类作为基类时,它的析构函数应该为虚析构函数(基类析构函数前加virtual关键字),这样才能保证调用子类的析构函数。
如过基类的析构函数不是虚析构函数,所以是根据指针的类型调用析构函数,而不是根据指针指向对象的类型调用析构函数,此时就不能执行子类的析构函数了。
测试代码:
#include <string>
#include <iostream>
class BaseClass
{
public:
BaseClass()
: m_pValue(NULL)
{
}
/*virtual */~BaseClass()
{
delete m_pValue;
m_pValue = NULL;
std::cout << "BaseClass virtual construct." << std::endl;
}
void SetValue(int v)
{
if (!m_pValue)
{
m_pValue = new int(v);
}
else
{
*m_pValue = v;
}
}
private:
int* m_pValue;
};
class SubClass : public BaseClass
{
public:
SubClass()
: BaseClass()
, m_pstrName(NULL)
{
}
/*virtual */~SubClass()
{
delete m_pstrName;
m_pstrName = NULL;
std::cout << "SubClass virtual construct." << std::endl;
}
void SetName(const std::string& name)
{
if (!m_pstrName)
{
m_pstrName = new std::string(name);
}
else
{
*m_pstrName = std::string(name);
}
}
private:
std::string* m_pstrName;
};
int main()
{
BaseClass* pObj = new SubClass();
pObj->SetValue(10);
((SubClass*)pObj)->SetName("zhangsan");
delete pObj;
pObj = NULL;
return 0;
}
资料: