看板 EE_DSnP 關於我們 聯絡資訊
※ 引述《popo4231 (小泰)》之銘言: : 請問C++把有virtual function存在的class限制必須要有virtual destructor : 是有什麼目的嗎 : 而且還只有限制delete dynamically allocated物件的能力 : 這是為什麼? 承上篇, derived class object 中有個 virtual table pointer (that's why the size of derived class is at least 4 Bytes more than parent class), 對於 parent class function 被宣告成 virtual 的, derived class 可以 override 他的 definition 而直接 call derived class function 例如: class P { public: virtual void f() { cout << "P::f()" << endl; } }; class C : public P { public: void f() { cout << "C::f()" << endl; } }; int main() { P* p1 = new C; P* p2 = new P; P* p3 = new P; C* p4 = new C; p1->f(); p2->f(); p3->f(); p4->f(); } ======== The output is: C::f() P::f() P::f() C::f() Anyway, 這可能無關乎本問題的重點, 不過只是想說如果想知道 virtual 的大致用法的話, 可以看上面的例子. 至於原來的問題, 例如說上例中如果我們: delete p1; 那麼只會呼叫 class P 的 destructor, 而不會去呼叫 class C 的, 因為對 delete 而言, 他看起來像個 P*, 而非 C* 所以試想如果 class C 中有些東西需要被 destructor clean up, 或是它裡面有 pointed memory 需要被 explicitly deleted, 那麼我們會希望 C 的 destructor 能在 P 的 destructor 之前也被呼叫一下, 但是問題是 destructor 並不能被 "explicitly called"... 怎麼辦? 所以如果將 parent class 的 destructor 宣告成 virtual, 那麼透過 virtual table, derived class destructor 就會被呼叫了. 注意, 這裡的 virtual 與一般 member function 的 virtual 意義有點不同喔! (等我上課再講吧!) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.134.219
timrau:沒有virtual的話 delete p1;應該只會呼叫~P()而非~C() 12/16 23:01
timrau:因為沒有vtable幫忙 表面上他是個P* 不會知道要~C() 12/16 23:02
ric2k1:喔對! 感謝 timrau 指正, 我寫錯了... 12/16 23:27
※ 編輯: ric2k1 來自: 59.121.134.219 (12/16 23:36)
ric2k1:已修正!! 12/16 23:36