//############################################################################
/*
在多态虚基类中声明一个虚析构函数
*/
/* 为什么需要虚析构函数 */
class yellowdog : public dog {
};
dog* dogFactory::createDog() {
dog* pd = new yellowdog();
return pd;
}
int main() {
dog* pd = dogFactory::createDog();
...
delete pd; // 只有基类dog的析构函数被调用,资源部分释放
}
/*
解决方法1 :
*/
class dog {
virtual ~dog() {...}
}
/*
-- 什么时候需要使用虚析构函数:
任何有虚函数的类都必须有虚析构函数
-- 什么时候不适用虚析构函数:
1. 类的大小需要很小的时候
2. 类的大小需要精确的时候,例如将一个对象从C++传到C
*/
/*
方法2: 使用shared_ptr,注意使用unique_ptr并没有此效果
*/
class dog {
~dog() {...}
}
class yellowdog : public dog {
~yellowdog() {...}
};
class dogFactory {
public:
// 生成yellowdog
static shared_ptr<dog> createYellowDog() {
return shared_ptr<yellowdog>(new yellowdog());
// ... 生成其他dog
}
int main() {
shared_ptr<dog> pd = dogFactory::createYellowDog();
/*
注意:所有的STL类都没有虚析构函数,所以在继承的时候要小心。尽可能使用智能指针
*/