日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

一次实现可以在某些场合替代菱形继承?

發布時間:2025/5/22 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一次实现可以在某些场合替代菱形继承? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? 前不久在C++板塊請教過這樣一個問題:“多個基類中相同的純虛函數,只需在派生類中實現一次”是否是標準行為。這個問題直到現在我也還沒能確定,不過我在VC2005、VC2008和g++上都試過,該特性在所有這些編譯器上都可以正常工作,所以應該八九不離十了。另外,記得當時星星有“語法正確邏輯說不過去”一說,那時想想確實也有些別扭。不過,最近在工作中又遇到了一個類似的問題,再加上一些突發奇想,于是產生了標題中的這個想法。考慮下面的三個類:

? ?

??? ClientOne通過調用Server的method_one()和method_two()方法和Server交互,ClientTwo通過調用Server的余下方法與Server交互。通常在設計良好的OO項目中,為了降低各對象之間的依賴,像這種問題都需要提取接口,并根據客戶對接口進行隔離,那么,上面的依賴關系就會變成下面這樣:

? ?

??? 現在Server只要直接實現InterfaceOne和InterfaceTwo這兩個接口就行了,接口實現在C++中表現為繼承,所以在C++中Server直接派生自這兩個基類就行了。問題似乎解決了。但如果ClientOne和ClientTwo都需要通過另一個叫做“shared_method()"的方法與Server交互,那會怎樣?對,繼續提取接口:

? ?

??? 這里出現了菱形繼承,所以在C++中就需要使用虛繼承,代碼就會是這樣:

??? class SharedInterface {
??? public:
??????? virtual void shared_method() = 0;
??????? virtual ~SharedInterface() {}
??? };
?????? ?
??? class InterfaceOne : public virtual SharedInterface {
??? public:
??????? virtual void method_one() = 0;
??????? virtual void method_two() = 0;
??????? virtual ~InterfaceOne() {}
??? };
?? ?
??? class InterfaceTwo : public virtual SharedInterface {
??? public:
??????? virtual void method_three() = 0;
??????? virtual void method_four() = 0;
??????? virtual ~InterfaceTwo() {}
??? };
?????? ?
??? class Server : public InterfaceOne, public InterfaceTwo {
??? public:
??????? virtual void method_one();
??????? virtual void method_two();
??????? virtual void method_three();
??????? virtual void method_four();
??????? virtual void shared_method();
??????? ...
??? };????? ?

??? 有些時候并不是所有人都愿意使用虛繼承,所以某些人就會突發奇想,看看自吸磁力泵能否回避之。我就是其中之一。根據”一次實現“,我把shared_method下推至InterfaceOne和InterfaceTwo,這樣就可以把SharedInterface去掉:

? ?

??? 哈哈,不但去掉了虛繼承,還直接少了一層繼承,這個世界干凈啦!當然,這個方法對于兩個接口中存在很少部分的重疊方法還是挺方便的,但如果重疊方法過多,還是應該提取出一個公共接口,以避免自吸磁力泵過多的重復。

評論列表
周星星2014-4-7 15:44:47
re: “一次實現”可以在某些場合替代棱形繼承?

從編譯器實現手段上講,你的這個做法應該是安全的。

"有些時候并不是所有人都愿意使用虛繼承"
--- 虛繼承挺好的呀!我覺得虛繼承唯一的缺點是 如果不知道當時或以后會有InterfacdeTwo的話則無法確定InterfacdeOne需不需要虛繼承SharedInterface。

如果接口交叉過多的話,使用虛繼承可能層次變得非常復雜且難于擴充,可以使用另一種解決手段是,
class Server
{
public:
??? void shared_method();
??? void method_one();
??? void method_two();
??? void method_three();
??? void method_four();
};

// InterfaceOne.hpp
class Server;
class InterfaceOne
{
public:
??? void shared_method();
??? void method_one();
??? void method_two();
private:http://www.hrbust.edu.cn/
??? Server* pServer_;
};
// InterfaceOne.hpp
#include "Server.hpp"
void InterfaceOne::shared_method() { pServer_->shared_method(); }
void InterfaceOne::method_one() { pServer_->method_one(); }
void InterfaceOne::method_two() { pServer_->method_two(); }
笨笨豬2014-4-7 15:44:47
re: “一次實現”可以在某些場合替代棱形繼承?
TO:星星
你的這種思想很好!很多時候我們的確是在濫用繼承關系,經常在需要使用委托的時候卻選擇了繼承。不過對于當前這個問題,我覺得繼承要比委托更恰當,我想到的有兩方面原因:
1. 因為我在這里要表達的是接口與實現之間的關系(我所說的接口指的是純抽象類,不包含任何狀態,我們只能通過生成子類的實例來使用它),而不是其他的什么關系。
2. 繼承比委托更簡單,雖然委托具有更大的靈活性,但在這里不必要。如果在這個問題上使用委托,我們就必須再額外多管理兩個對象的生命周期,因為現在InterfaceOne和InterfaceTwo變成了具體類,而不是接口,必須要被創建和管理。

我并不是說虛繼承怎么樣不好,而是引入虛繼承之后,就出現了不一致性,我必須要時刻記住哪里該用常規繼承,哪里該用虛繼承。
另外,我覺得這個問題的更本原因是因為C++不支持interface關鍵字造成的。對于那些有狀態的基類,菱形繼承中如果不使用虛繼承肯定會產生二義性,但是對interface這樣的無狀態的純抽象基類,菱形繼承中不存在任何二義性

轉載于:https://www.cnblogs.com/shhxpump/p/3754729.html

總結

以上是生活随笔為你收集整理的一次实现可以在某些场合替代菱形继承?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。