1. 程式人生 > >C++進階--派生類的析構(虛解構函式,shared_ptr)

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類都沒有虛解構函式,所以在繼承的時候要小心。儘可能使用智慧指標
*/