作者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