C++进阶--派生类的析构(虚析构函数,shared_ptr)

//############################################################################
/*
在多态虚基类中声明一个虚析构函数
*/

/* 为什么需要虚析构函数 */
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类都没有虚析构函数,所以在继承的时候要小心。尽可能使用智能指针
*/

猜你喜欢

转载自www.cnblogs.com/logchen/p/10165197.html