猫猫哥

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
//############################################################################
/*
在多态虚基类中声明一个虚析构函数
*/

/* 为什么需要虚析构函数 */
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类都没有虚析构函数,所以在继承的时候要小心。尽可能使用智能指针
*/
posted on 2018-12-23 19:04  猫猫哥  阅读(1042)  评论(0编辑  收藏  举报