首頁>Club>
現在有一個基類Base,和一個派生類Derived:public Base,我用一個基類的指標指向派生類的物件:Base* pBase = new Derived。
7
回覆列表
  • 1 # GenuineJyn

    把你的問題整理一下如下:

    這個時候我delete 執行父類的指標又會發生什麼呢?

    實際執行是通常發生的是物件的derived成分沒有被銷燬(不同的編譯器實現可能不同),而派生類中的base class成分通常會被銷燬,這就造成了一個“區域性銷燬”的物件,從而造成資源洩露。

    在Meyers的《Effective C++》《More Effective C++》中都提到過virtual解構函式,消除這個問題很簡答:給base class一個virtual解構函式,這會保證執行適當的解構函式。

    Now,現在就有這樣一個問題,是不是要把所有的class的解構函式都要帶上virtual呢,這同樣是錯誤的。要實現virtual函式,物件必須攜帶某些資訊,主要用來在執行時決定哪一個virtual函式應該被呼叫。這份資訊通常是由一個所謂vptr(virtual table pointer)指標指出。vptr指向一個由函式指標構成的陣列,成為vtbl(virtual table);每一個帶有virtual函式的class都有一個相應的vtbl。當物件呼叫一個virtual函式,實際被呼叫的函式取決於該物件的vptr所指的那個vtbl,編譯器在其中尋找適當的函式指標。當然在Scott Meyers的另一本書《More Effective C++》中有詳細的介紹,同時嘗試實現虛擬函式機制。virtual函式的實現細節並不重要,重要的是如果class中含有virtual函式,其物件的體積會增加,這會帶來許多麻煩問題。

  • 中秋節和大豐收的關聯?
  • 喜劇電影《意外關係》能否在2019年脫穎而出?