精華區beta Programming 關於我們 聯絡資訊
※ 引述《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