[心得] 整理了一下多重繼承的相關概念或資料出處

看板C_and_CPP作者 (咕啾咕啾魔法陣)時間2年前 (2021/06/23 12:40), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
(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://www.ptt.cc/bbs/C_and_CPP/M.1624423252.A.26D.html
文章代碼(AID): #1WqhjK9j (C_and_CPP)