※ 引述《milochen.bbs@ptt.cc (作事專心很重要)》之銘言:
> ※ 引述《tinlans ( )》之銘言:
> : 首先澄清一個觀念,
> : destructor 不可以被繼承,
> : 一定要在 base class 裡實作完畢。
> : 所以你需要一個 Spec.cpp:
> : #include "Spec.h"
> : AbstractBase::~AbstractBase() throw()
> : {
> : }
> : 這樣就結束了,
> : 因為你說 Spec.h 不能改,
> : 所以我沒跟你說直接在 Spec.h 那邊把 ; 換成 { } 就好。
> 再請問一下
> 那這樣子的話virtual destructor 的意義在那邊?
> 譬如就如下面程式來說
> 小弟原本以為說 virtual destructor的功用是
> 當我作delete someobj動作的時候,它是會去執行 ConcreteDerived的destructor。
> 因此如果我對AbstractBase有不同的concrete class時,那virtual destructor
> 就會很聰明的它 這destructor 導向至正確的concrete class上的destructor。
> 所以我原本的這觀念是不是錯誤的。
你原本想的沒錯 (不過你上面 "就會很聰明..." 那句文字有些亂 ^^")
我猜你搞錯了 tinlans 的話
其實他的意思只是說 base class 的 virtual destructor 要有實作就是了
實作就是要有 { /*some code*/ }
(而非像是 pure virtual function 是留到 derived class 來實作)
#include <stdio.h>
class XD {
public:
XD(){ puts("XD ctor"); }
virtual ~XD(){ puts("XD dtor"); }
};
class XDD : public XD {
public:
XDD(){ puts("XDD ctor"); }
~XDD(){ puts("XDD dtor"); }
};
int main(){
XD *xd0 = new XDD;
delete xd0;
}
======
output
======
XD ctor
XDD ctor
XDD dtor
XD dtor
--
@, ●秘密情人● (bbs.cse.ttu.edu.tw)
~\ ◆ Post From: 61-228-193-213.dynamic.hinet.net ◆