在破壞派生類對象的過程中,我首先擊中派生類析構函數,然後擊中基類析構函數(與預期的一樣)。但我很想知道 - 派生類的函數在什麼點上超出了範圍(被銷燬)。派生類破壞期間的純虛函數的作用域 - 在C++中
只要控件離開派生類析構函數並朝向基底,它會發生嗎?或者一旦我們完成了基類析構函數,它也會發生。
由於
在破壞派生類對象的過程中,我首先擊中派生類析構函數,然後擊中基類析構函數(與預期的一樣)。但我很想知道 - 派生類的函數在什麼點上超出了範圍(被銷燬)。派生類破壞期間的純虛函數的作用域 - 在C++中
只要控件離開派生類析構函數並朝向基底,它會發生嗎?或者一旦我們完成了基類析構函數,它也會發生。
由於
一旦最派生類飾面的析構函數,動態對象的類型可以認爲在下一個衍生少型。也就是說,調用基本析構函數中的虛擬方法會發現,該時間點的最終覆蓋是基本級別的。 (施工期間發生相反)
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
函數不會被破壞。
但是,只要派生析構函數完成,虛函數就會在v表中刪除它們的條目,所以您不能從基準調用派生虛函數。
謝謝Shoosh。這是你提到的關於v-table的另一個好處。 – 2010-06-29 10:44:35
不錯的答案。這是否意味着'實際上'你不應該從析構函數中調用虛函數? – xtofl 2010-06-29 10:01:42
是的,請看看:http://www.artima.com/cppsource/nevercall.html – 2010-06-29 10:07:01
謝謝大衛。對不起,以下是長文本: 但假設我從基類構造函數中產生了一個線程,並在基類析構函數中銷燬它。該線程調用派生類中實現的虛擬方法。 現在,在我銷燬基類析構函數中的線程之前,線程會觸發並調用派生類的虛方法。但是我們已經超越了派生類的析構函數。這個線程仍然會找到在派生類中實現的虛擬方法的定義嗎?或者是派生類的虛方法實現超出了範圍。 – 2010-06-29 10:17:32