2010-06-29 29 views
4

在破壞派生類對象的過程中,我首先擊中派生類析構函數,然後擊中基類析構函數(與預期的一樣)。但我很想知道 - 派生類的函數在什麼點上超出了範圍(被銷燬)。派生類破壞期間的純虛函數的作用域 - 在C++中

只要控件離開派生類析構函數並朝向基底,它會發生嗎?或者一旦我們完成了基類析構函數,它也會發生。

由於

回答

8

一旦最派生類飾面的析構函數,動態對象的類型可以認爲在下一個衍生少型。也就是說,調用基本析構函數中的虛擬方法會發現,該時間點的最終覆蓋是基本級別的。 (施工期間發生相反)

struct base { 
    base() { std::cout << type() << std::endl; } 
    virtual ~base() { std::cout << type() << std::endl; } 
    virtual std::string type() const { 
     return "base"; 
    } 
}; 
struct derived : base { 
    virtual std::string type() const { 
     return "derived"; 
    } 
}; 
int main() { 
    base *p = new derived; 
    std::cout << p->type() << std::endl; 
    delete p; 
} 
// output: 
// base 
// derived 
// base 
+0

不錯的答案。這是否意味着'實際上'你不應該從析構函數中調用虛函數? – xtofl 2010-06-29 10:01:42

+2

是的,請看看:http://www.artima.com/cppsource/nevercall.html – 2010-06-29 10:07:01

+0

謝謝大衛。對不起,以下是長文本: 但假設我從基類構造函數中產生了一個線程,並在基類析構函數中銷燬它。該線程調用派生類中實現的虛擬方法。 現在,在我銷燬基類析構函數中的線程之前,線程會觸發並調用派生類的虛方法。但是我們已經超越了派生類的析構函數。這個線程仍然會找到在派生類中實現的虛擬方法的定義嗎?或者是派生類的虛方法實現超出了範圍。 – 2010-06-29 10:17:32

4

函數不會被破壞。

但是,只要派生析構函數完成,虛函數就會在v表中刪除它們的條目,所以您不能從基準調用派生虛函數。

+0

謝謝Shoosh。這是你提到的關於v-table的另一個好處。 – 2010-06-29 10:44:35

相關問題