正在回答這個問題 - Pure virtual call in destructor of most derived class - 我嘗試了一些代碼來檢查一些語法,並發現當調用sucessive析構函數時,它們會調用它們相關的虛函數。考慮下面的代碼:爲什麼在析構函數中虛擬表設置回該級別?
class Base
{
public:
virtual void Method() = 0;
};
class Derived : public Base
{
public:
~Derived()
{
Method();
}
virtual void Method()
{
cout << "D";
}
};
class DoubleD : public Derived
{
public:
~DoubleD()
{
Method();
}
virtual void Method()
{
cout << "DD";
}
};
int main(array<System::String ^> ^args)
{
DoubleD D;
DoubleD E;
return 0;
}
如所預期的,當對象被破壞時,它調用正確的方法(例如,第一最衍生,然後將第二個最導出)。
輸出:DD D
我的問題是,這是爲什麼?既然你不打算在c'tor/d tor中調用虛函數,爲什麼虛表要「正確地展開」呢?
例如,我可以看到爲什麼最派生的工作,這是虛擬函數指針表在啓動時的狀態。但是爲什麼當調用Derived
的析構函數時,該表是否正確設置爲指向該類實現Method
。
爲什麼不只是離開它,或者如果它很好,請將該值設置爲NULL。
「將值設置爲NULL」?設置*什麼*值爲空?!另請注意,C++中沒有「vtable」。這是一個實現細節,如果你已經設法瞭解它,那麼你可能真的很接近學習如何實現析構函數 - 爲什麼你停止閱讀? – 2013-05-13 20:46:48
在附註上,將析構函數標記爲虛擬。使用虛擬功能是一種很好的做法。 – bjskishore123 2013-05-13 20:49:30
「既然你不打算在c'tor/d tor中調用虛函數」:誰告訴你的?建議是要小心地打電話給他們,因爲他們已經「解開」(就像你所說的那樣),可能不會達到你的期望。 (如果它們是純虛擬的,不要打電話給他們;這是不允許的。) – 2013-05-13 21:17:20