作者milochen (作事專心很重要)
看板Programming
標題Re: [問題] 如何實現C++的virtual destructor?
時間Mon Jan 22 01:56:59 2007
※ 引述《tinlans ( )》之銘言:
: ※ 引述《milochen (作事專心很重要)》之銘言:
: : 有一個標準制定,制定了 Spec.h 的東東,而我必須要為Spec.h上的abstract class
: : 來來實作出對應的concrete class。
: : 所以唯獨Spec.h裡的code不能更改就是了。
: : //file : Spec.h
: : class AbstractBase
: : {
: : public:
: : virtual ~AbstractBase ()
: : throw ();
: : virtual void someFunction ()
: : throw (someException) = 0;
: : };
: : #endif //_SPEC_H
: 首先澄清一個觀念,
: 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。
所以我原本的這觀念是不是錯誤的。
因為我想說,
如果是要實現 AbstractBase::~AbstractBase()的話
那不就等於說這個destructor 就必須在AbstractBase::~AbstractBase()就寫完了
那麼這樣子的話ConcreteDerived class的destructor就無法被啟動了
//file : test.cpp
#include "Spec.h"
#include "ImplementSpec.h"
class ConcreteDerived;
int main(){
AbstractBase *someobj = new ConcreteDerived();
delete someobj;
return 0;
}
講到這邊為止,我想應該是觀念不知那邊錯了,還請大大指教^__^y
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.224.241.225
推 MotherCon:先解構derived再解構base 都要解構子 140.117.164.59 01/22 02:11
推 march20:簡單一句話, 就是 constructor 變成了 71.137.4.118 01/22 02:35
推 march20:virtual function. virtual function 71.137.4.118 01/22 02:35
推 march20:怎麼運作, 那 virtual dest* 就怎麼運作 71.137.4.118 01/22 02:35
推 march20:呃, type, (第一行是 dest*, 不是 const*) 71.137.4.118 01/22 02:36
推 UNARYvvv:樓上, constructor 變 virtual func. ?? 61.228.193.213 01/22 02:45
推 march20:啊, double typo. 先是 destructor 打成了 71.137.4.118 01/22 03:06
推 march20:constructor, 然後 typo 又打成 type 0rz 71.137.4.118 01/22 03:06