作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題Re: [問題] pure virtual destructor 怎宣告?
時間Wed May 19 01:39:59 2010
L大說的其實我是知道 先問幾個問題~如下
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: ※ 引述《QQ29 (我愛阿蓉)》之銘言:
: * 所以你可能會這樣寫:
: Derived::~Derived()
: {
: delete [] my_derived_data;
: ~Base(); // 呼叫 Base dtor 以釋放 Base::my_data
: }
手動加的話 那compiler會在幫你加嗎? 變成清兩次...我想是不會....
因為我用VC手動寫 他不讓我呼叫~Base();
unary '~' : 'Base' does not define this operator or a conversion to a
type acceptable to the predefined operator
改成Base::~Base();即可 差別在哪....??
但竟然變成呼叫兩次 ~Base了 造成double free...
所以結論應該是不要雞婆手動亂加嚕?
我問這篇 原本是覺得
如果Base *p = new Derived;
p->某A::的function(); <====ok dynamic binding 如果B有override就跑B
所以我以這樣的想法去想
delete p;
類似p->~Base(); 發現兒子有override 就去跑~Derived
(我以為~Derived()就算是~Base的override) 但原文的推文T大也說不是..
因為我把delete p; 呼叫~Base 因為兒子有override所以就去跑 ~Derived
這個行為 想成一般多型的感覺....
而我又覺得說 我都已經是interface了 如果又加個空定義
好像就不算是pure virtual了....
才這樣問一下~!
所以其實~Derived()照L大之前那篇文章
他只是蓋掉virtual table紀錄的位址把&~Base 改成&~Derived嗎?
另外藉此問一下
既然Base的private
我Derived繼承下來卻用不到
真要存取 還要寫成 A::PublicFunc();
然後就算存取了 也沒有啥用處....真要用就改成protected阿
我就在想 C++繼承下來 為啥要連同private都給繼承了
意思大概就是 sizeof(Base)+sizeof(Deived)-sizeof(所有Base::private)
這樣不是多佔了些記憶體空間 又沒啥意義嗎?
還是說Derived有什麼設計 是非得在 Base寫private
不然何必要繼承給Derived呢....
謝謝....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.192.105.173
推 holymars:..你這樣從Derived up-casting成Base時會發生什麼事.. 05/19 02:20
→ holymars:請求大宇宙的意志把你丟掉的那塊private送回來嗎 05/19 02:20
→ holymars:繼承的意思是is-a或has-a,不是is-some-part-of 05/19 02:22
→ holymars:怎麼能只繼承一半啊XDD 05/19 02:22