作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [問題] 關於 virtual destructor
時間Sun Dec 16 22:47:22 2007
※ 引述《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
1F:推 timrau:沒有virtual的話 delete p1;應該只會呼叫~P()而非~C() 12/16 23:01
2F:→ timrau:因為沒有vtable幫忙 表面上他是個P* 不會知道要~C() 12/16 23:02
3F:→ ric2k1:喔對! 感謝 timrau 指正, 我寫錯了... 12/16 23:27
※ 編輯: ric2k1 來自: 59.121.134.219 (12/16 23:36)
4F:→ ric2k1:已修正!! 12/16 23:36