看板 C_and_CPP 關於我們 聯絡資訊
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