C_and_CPP 板


LINE

(1)菱形繼承 導致了二義性問題,有幾種方式解決 一種是限制繼承深度,讓菱形繼承無法出現 一種是使用虛擬繼承,但虛擬繼承本身帶來以下問題(細節見Effective C++ Item 40) 虛基類初始順序較複雜 由最終派生類呼叫虛基類ctor,容易踩坑 佔比較多的空間,且影響data存取速度 (2)指標偏移 父類指標與子類指標指向同一實體,但位址未必相同 不過指標拿來做比較運算時相同,因為會隱式轉型成父類指標再比較 (3)轉型導致虛函數執行結果無法預期 第一種情況是涉及void*,導致轉型時指標不偏移 第二種情況是使用不偏移指標的轉型:reinterpret_cast (4)More Effecitve C++ Item M24 影響效能且佔比較多的空間 (5)Google C++ Style Guide 多重繼承本身帶來的效能影響比虛擬繼承還高 避免多重實作繼承 (6)Effective C++ Item 40 public介面繼承 + private實作繼承 (7)C++ Core Guidelines C.135 用多重繼承表示多個不同的介面,這些介面通常是抽象類 (8)C++ Core Guidelines C.136 用多重繼承表示實現特性的合併;此item認為優先使用單一繼承 (9)Modern C++ Design 第一章的policy based design,結合多重繼承跟template 第三章的hierarchy generator,現在可以用variadic template簡化 (10)C++ Templates: The Complete Guide 21.3 mixin,能在不複製介面的情況下增加data成員或其他操作 為了增加任意數量的base,會用到variadic template 補充: mixin跟policy based design都是多重實現繼承 前者與派生類有"-ABLE"的關係 後者強調在相同介面下選擇何種行為,而不是增加data成員或其他操作 前者應採用public繼承,後者應採用private繼承 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.113.163 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1624423252.A.26D.html
1F:→ KanzakiHAria: 少用繼承多用組合 06/25 12:26
2F:→ loveflames: 優先用組合是當然,不過講這個又要提bridge pattern了 06/25 12:28
3F:→ loveflames: C++官網也有探討過這個 06/25 12:28
4F:推 ShenJing: 感謝整理 06/25 15:03
既然推文提到優先使用組合,那麼就進一步討論這個 基本上就是因為繼承的耦合度比較高 除了編譯相依性外,修改父類很可能導致子類一起修改,我想了幾個可能情境 父類原本沒有與子類同名的函數,後來加上去 父類允許的繼承深度遭到改變 父類從一般繼承改成虛擬繼承祖父類 父類有無不變式(invariant)的性質遭到改變 (不知道不變式是什麼的,請參考Google C++ Style Guide跟C++ Core Guidelines) 另外,C++官網列了三個經驗法則 https://isocpp.org/wiki/faq/multiple-inheritance 經驗法則1:僅當這樣做會刪除if/switch語句時使用繼承 經驗法則2:多重繼承盡量繼承抽象類 經驗法則3:考慮bridge pattern跟nested generalization能否作為替代方案 如果採用以上連結內容的觀點 以二維(M種產品 + N種顏色)為例,考量三種方案的優缺點 多重繼承 優點:可同時為產品維度跟顏色維度提供多型 缺點:多重繼承跟虛擬繼承帶來的問題 可能是優點也可能是缺點:有M x N個實作類別 bridge pattern 優點:將顏色維度分離出去,繼承關係變成組合關係 缺點:無法在編譯期排除某些組合(例如:背包 + 黑色) 可能是優點也可能是缺點:有M + N個實作類別 nested generalization: 缺點:第一層產品維度 + 第二層顏色維度,無法共享顏色維度的代碼 可能是優點也可能是缺點:有M x N個實作類別 ※ 編輯: loveflames (125.227.113.163 臺灣), 06/25/2021 16:21:34
5F:推 KanzakiHAria: 推推 06/25 21:00
6F:→ DerLuna: 不要用繼承 06/27 19:01







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP