因工作需要,在學習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 建構函式一一如果那些成員變數在 成員初值列 中沒有被指定初值的話,因而引發某些程式設計師過度誇張地採用以上寫法。那是可理解的,但請立下乙個規則,規定總是在初值列中列出所有成員變數,以免還得記住哪...