如果我不想用C++的多继承,如何实现类似java的实现接口语法来扩展类?
黄舟
黄舟 2017-04-17 11:51:15
0
5
542

C++的多继承很难理解,可是如果单继承又觉得以后无法扩展功能,object-c有protocol,C++没有。

那如何扩展类的功能呢?

谢谢!

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(5)
洪涛

C++要想實作protocol或java的interface,除了多繼承沒有它路了…怕衝突可以使用虛繼承。
列出兩種不怎麼可行的做法:

一種是使用組合而非繼承。
把想實現的一組功能定義為一個類別A,然後把這個類別A當作一個目標類別B的一個成員。再給類別B寫出一組public方法,這些方法將透過轉調類別A的方法來實現功能。
但是這樣做實作不了像interface那樣的功能。原因很明顯,類A和類B不位於同一個類體系中。

第二種是使用模板。
如果某個類別實作了一組想要的功能,我們就可以給這個類別提供一個tag。如果有一個函數需要使用這一組功能,那麼我們可以檢查給的模板參數中是否有這麼一個tag,如果沒有這麼一個tag,程式將不能通過編譯。
但是這樣比較複雜,真的決定要這麼做麼?

其實,如果不要求實作成protocol,可以考慮使用工廠函數/物件。即提供一組參數作為函數/方法的參數,生成基底類別相同,但是對基底類別方法的實作有差異的一組子類別。這樣就能使用基底類別指標呼叫它們的方法。

洪涛

java類別實作介面的語意,就是c++裡的虛繼承,目的就是為了避免菱形繼承的二義性問題。

刘奇

C++中的設計模式對於你的這種擴展一般使用繼承+組合來實現;
你可以考慮先使用一個抽象類別Abstraction,用業務類別RefinedAbstraction繼承它;
然後,根據你的需要,將你需要進行功能擴展的介面以組合的形式(一般定義為指標)放到你的抽象類別或業務類別中:
Implementor:實作類別介面
ConcreteImplementor:具體實作類別

參考《圖說設計模式》中橋接模式的這張圖你就明白了:

詳情請見:
http://design-patterns.readthedocs.org/zh_CN/latest/structural_patterns/bridge.html

Peter_Zhu

盡量多用組合,少用繼承,java,objC和C++都是

洪涛

少用繼承,多用 std::function / std::bing / lambda

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板