在Web和C++中沉浮 (隨筆二)

寫之前, 想針對我前幾天發表的一篇技術文檔說點什麼,深入 CSocket 編程之阻塞和非阻塞模式 一文
分別在CSDNVCKBase上發表:

http://dev.csdn.net/develop/article/58/58739.shtm

http://www.vckbase.com/document/viewdoc/?id=1375

這是我自認爲寫的比較好的文章,而且這是我第一次在VCKBase發表的文檔,這篇文章詳細講解了WinSock的工作機制,記得當時寫這篇技術文檔直至半夜方纔得以完成。



現將這些天碰到的問題記錄一下:

來自CSDN的一篇文檔 什麼時候需要虛析構函數 引起我的興趣,讓我對C++的認識又進一步:
先引用Lostmouse譯:Effective C++
C++語言標準關於這個問題的闡述非常清楚:當通過基類的指針去刪除派生類的對象,而基類又沒有虛析構函數時,結果將是不可確定的。
......
聲明析構函數爲虛就會帶來你所希望的運行良好的行爲:對象內存釋放時,派生類enemytank和基類enemytarget的析構函數都會被調用。


我的理解是,對於定義基類的析構函數爲虛函數的好處在於,在從派生類類型至基類類型轉換後,在析構過程中也能確保派生類和基類的析構函數均被調用!
簡單用代碼說明:

class A
{
    A() {}
    virtual ~A() {} // 定義爲虛析構函數
}

class B : public A
{
    B() {m_psz = new char(256);} // 在堆(heap)中分配256個字節,返回首地址m_psz
    ~B() {delete m_psz;} // 析構時釋放堆

    char* m_psz;
}

int main(int argc, char* argv[])
{
    A* p = new B; // 1
    delete p; // 
2

    return 0;
}

1. 派生類B實例的指針p被轉換爲基類A指針。
2. 引用:《C++ Primer》 (潘愛民譯):虛擬函數機制只在使用指針和引用時纔會如預期般起作用。(潘愛民譯)
在定義類A的析構函數爲虛函數的情況下,直到運行時才能確定p調用哪一個類實例中的析構函數。
實際析構過程:派生類B的析構函數先被調用,然後是基類A的析構函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章