※ 引述《milochen (作事專心很重要)》之銘言:
: 再請問一下
: 那這樣子的話virtual destructor 的意義在那邊?
: 譬如就如下面程式來說
: 小弟原本以為說 virtual destructor的功用是
: 當我作delete someobj動作的時候,它是會去執行 ConcreteDerived的destructor。
現在改成這樣的話,
它還是會去執行 ConcreteDerived 的 destructor,
並依照原本 destruction 機制,
在執行完 ConcreteDerived 的 destructor 後,
還會跳下去執行 AbstractBase 的 destructor (所以需要它的實體);
雖然 destructor 無法被繼承,
但 virtual function 對它的效果仍然存在,
只不過是 function name 不同名 (這也是它無法被繼承的原因),
所以看起來會像是一種特例。
: 因此如果我對AbstractBase有不同的concrete class時,那virtual destructor
: 就會很聰明的它 這destructor 導向至正確的concrete class上的destructor。
: 所以我原本的這觀念是不是錯誤的。
這部分沒有錯誤。
: 因為我想說,
: 如果是要實現 AbstractBase::~AbstractBase()的話
: 那不就等於說這個destructor 就必須在AbstractBase::~AbstractBase()就寫完了
: 那麼這樣子的話ConcreteDerived class的destructor就無法被啟動了
可能時間太晚你有點昏頭了,
就算今天你普通 virtual function 不是 pure virtual function,
在 base class 有定義好了,
這也只不過代表當你的 derived class 沒有定義它時,
會使用 base class 的版本,
而當你的 derived class 有定義它時,則它會使用 derived class 的版本,
所以對 virtual destructor 來說,
因為你的 derived class 有定義 destructor (沒寫也會自動產生),
所以一定會先跳上去執行它,
這跟普通的 virtual function 沒有差別。
: //file : test.cpp
: #include "Spec.h"
: #include "ImplementSpec.h"
: class ConcreteDerived;
: int main(){
: AbstractBase *someobj = new ConcreteDerived();
: delete someobj;
: return 0;
: }
: 講到這邊為止,我想應該是觀念不知那邊錯了,還請大大指教^__^y
: 謝謝
--
Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage: https://it.muds.net/~uranus
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.224.125