虛繼承與IUnknown不明確

2021-10-06 05:31:19 字數 1475 閱讀 5430

因工作需要,在學習com,此文章為學習過程中的一些記錄.

文章某些片段來自網路,侵刪.

本人萌新,文章有錯誤的地方,歡迎指出.

先看例子。

//定義兩個繼承於iunknown的結構體。

//inte***ce的巨集定義為struct,也就是結構體.結構體除了所有成員都是公有的外,與類幾乎無差別

//注:由於結構體的繼承預設是公有的,所以冒號後面加不加public都可以.

inte***ce ix : iunknown;

inte***ce iy : iunknown;

//類ca繼承於ix與iy

class ca :public ix,

public iy

} virtual ulong __stdcall addref()

virtual ulong __stdcall release()

virtual void __stdcall fx()

virtual void __stdcall fy()

};

上面的例子中,結構體ix和iy都繼承於iunknown。(結構體繼承時如果不宣告公有和私有,則預設為公有).

此時ix和iy中各自有乙個iunknown的「副本」.

類ca繼承於ix和iy,於是在ca中有兩個iunknown的「副本」,想將ca轉換為iunknown時,不知道取哪乙個副本,自然就會提示"定義不明確"了。

此時的解決辦法可以是,將ix和iy的繼承變成虛繼承:

inte***ce ix :virtual public iunknown;

inte***ce iy :virtual public iunknown;

虛繼承的意思是讓某個類做出宣告,承諾願意共享它的基類。其中,這個被共享的基類就稱為虛基類(virtual base class)。在這種機制下,不論虛基類在繼承體系**現了多少次,在派生類中都只包含乙份虛基類的成員。

但是,在c++與com結合時,ix和iy並不能按虛擬繼承的方式繼承iunknown,這是因為會導致生成出來的vtbl與com不相容。

那麼就需要將:

//*ppv = static_cast(this);		//會提示基類」iunknown"不明確
改寫為:

//需將this先轉換為其中他的其中乙個父類,再轉換為父類的父類。

*ppv = static_cast(static_cast(this))

同理,以下例子中,a.a的寫法也會報錯。

struct va ;

struct suba :public va {};

struct subb :public va {};

struct subab :public suba, subb {};

int main(void)

effective C 筆記(一)不明確行為

include 包含輸入輸出庫 include using namespace std bool leapyear int bool leapyear int year 判斷閏年 else union myun u int k a classa classb void dosomething b b...

一道問題不明確的SQL

有乙個員工表dept emp簡況如下 有乙個薪水表salaries簡況如下 獲取所有部門中員工薪水最高的相關資訊,給出dept no,emp no以及其對應的salary,按照部門編號公升序排列,以上例子輸出如下 先將兩表進行連線,然後拿出三個屬性 然後按部門號分組拿出max salary和dept...

開啟 不明確行為 的潘多拉盒子 解釋

由於編譯器會為使用者自定義型別 user defined types 之成員變數自動呼叫 default 建構函式一一如果那些成員變數在 成員初值列 中沒有被指定初值的話,因而引發某些程式設計師過度誇張地採用以上寫法。那是可理解的,但請立下乙個規則,規定總是在初值列中列出所有成員變數,以免還得記住哪...