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

作者: loveflames (咕啾咕啾魔法陣)   2021-06-23 12:40:50
(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繼承
作者: KanzakiHAria (神崎・H・アリア)   2021-06-25 12:26:00
少用繼承多用組合
作者: loveflames (咕啾咕啾魔法陣)   2021-06-25 12:28:00
優先用組合是當然,不過講這個又要提bridge pattern了C++官網也有探討過這個
作者: ShenJing (ShenJing)   2021-06-25 15:03:00
感謝整理
作者: KanzakiHAria (神崎・H・アリア)   2021-06-25 21:00:00
推推
作者: DerLuna (陽月)   2021-06-27 19:01:00
不要用繼承

Links booklink

Contact Us: admin [ a t ] ucptt.com