亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ COM編程之什么是接口?

 更新時間:2014年10月01日 09:52:27   作者:果凍想  
這篇文章主要介紹了C++ COM編程之什么是接口?在C++中,可以使用抽象基類來實現(xiàn)COM接口,需要的朋友可以參考下

什么是接口?

說到COM,就不得不說接口了;在進行COM開發(fā)的過程中,可以說,我一直都在和各種各樣的接口打交道。那接口是什么?對于COM來說,接口是一個包含一個函數(shù)指針數(shù)組的內(nèi)存結(jié)構(gòu),每一個數(shù)組元素包含的是一個由組件所實現(xiàn)的函數(shù)的地址;所以,對于COM,接口就是這樣的一個內(nèi)存結(jié)構(gòu),其它東西都是一些COM并不關(guān)心的實現(xiàn)細節(jié)。

在C++中,可以使用抽象基類來實現(xiàn)COM接口。由于一個COM組件可以支持任意數(shù)目的接口,因此對于組件,可以使用抽象基類的多重繼承來實現(xiàn)它。

接口的好處

接口提供了兩個不同對象間的一種連接。對于客戶來說,一個組件就是一個接口集??蛻糁荒芡ㄟ^接口才能同COM組件打交道。而整體上來講,客戶對于一個組件可以說是知之甚少;甚至在某些時候,客戶甚至不必知道一個組件所提供的所有接口,就像你進行Windows  Shell開發(fā)時,對于一個它提供的組件,很多時候,你不可能知道所有的接口的。對于一個應(yīng)用程序而言,接口是最重要的。組件本身只不過是接口的實現(xiàn)細節(jié)。

在實際開發(fā)時,你并不需要去理會組件的實現(xiàn)細節(jié),你面對的是接口,面對接口工作。即使組件的開發(fā)者將組件的實現(xiàn)替換掉了,而接口不變,你的程序也不需要變動。接口,就像一個標準一樣,讓我們?nèi)プ駨倪@個標準。之前做的一個項目就是替換一個組件的實現(xiàn)層,而對于接口,則不需要進行變更。

簡單的實現(xiàn)

通過一個簡單的例子來理解接口:

復(fù)制代碼 代碼如下:

/*
** FileName     : SimpleInterfaceDemo
** Author       : Jelly Young
** Date         : 2013/12/11
** Description  : More information, please go to http://chabaoo.cn
*/
#include <iostream>
#include <combaseapi.h>
using namespace std;
interface IExample1
{
     virtual void __stdcall Fx1() = 0;
     virtual void __stdcall Fx2() = 0;
};
interface IExample2
{
     virtual void __stdcall Fy1() = 0;
     virtual void __stdcall Fy2() = 0;
};
// Implementation
class CImplementation : public IExample1, public IExample2
{
public:
     // Implementation IExample1
     void __stdcall Fx1() { cout<<"CImplementation::Fx1"<<endl; }
     void __stdcall Fx2() { cout<<"CImplementation::Fx2"<<endl; }
     // Implementation IExample2
     void __stdcall Fy1() { cout<<"CImplementation::Fy1"<<endl; }
     void __stdcall Fy2() { cout<<"CImplementation::Fy2"<<endl; }
};
// Client
int main()
{
     cout<<"Create an instance of the component."<<endl;
     CImplementation *pCImplementation = new CImplementation;
     // Get the IExample1 pointer
     IExample1 *pIExample1 = pCImplementation;
     // Use the IExample1 interface
     pIExample1->Fx1();
     pIExample1->Fx2();
     // Get the IExample2 pointer
     IExample2 *pIExample2 = pCImplementation;
     // Use the IExample2 pointer
     // Use the IExample2 interface
     pIExample2->Fy1();
     pIExample2->Fy2();
     // Destroy the component
     if (pCImplementation != NULL)
     {
          delete pCImplementation;
          pCImplementation = NULL;
          pIExample1 = NULL;
          pIExample2 = NULL;
     }
}

上面的例子中,client通過兩個接口pIExample1和pIExample2來和組件進行通信。在聲明接口時,使用了兩個純抽象基類IX和IY??偨Y(jié)上面代碼的關(guān)鍵之處在于:

1.COM接口在C++中是用純抽象基類實現(xiàn)的;
2.一個COM組件可以提供多個接口;
3.一個C++類可以使用多繼承來實現(xiàn)一個可以提供多個接口的組件。

細節(jié)剖析

interface這貨是從哪里來的?你會很好奇,是不是好奇的連下巴都掉下來了?C++也有interface關(guān)鍵字?不錯,這個關(guān)鍵字是在combaseapi.h頭文件中定義的,定義如下:

復(fù)制代碼 代碼如下:

#define __STRUCT__ struct
#define interface __STRUCT__

說白了,就是用C++的關(guān)鍵字struct定義的一個結(jié)構(gòu)體。使用struct定義有什么好處呢?首先需要搞清楚struct和class的區(qū)別。學(xué)了Java和C#的都知道,由于接口中定義的都是允許客戶調(diào)用的,所以在接口中就不需要private和protected的了,如果使用class,而必須還要使用public關(guān)鍵字強調(diào)接口的公有屬性,而struct默認的都是公有屬性,這樣就省去了添加public關(guān)鍵字的麻煩。

__stdcall是什么?__stdcall是一種用來修飾函數(shù)的關(guān)鍵字,主要約定了兩件事情:

1.參數(shù)傳遞順序,__stdcall表示參數(shù)從右向左壓入堆棧;
2.調(diào)用堆棧由誰(調(diào)用函數(shù)或被調(diào)用函數(shù))清理,__stdcall表示由被調(diào)用函數(shù)修改堆棧。

接口是由純虛函數(shù)實現(xiàn)的,為什么是要這樣?以及展現(xiàn)出來的多態(tài),這個說來話長,我將在下一篇博文中進行總結(jié)。

總結(jié)

在這里對接口基礎(chǔ)知識進行了掃盲式的總結(jié),而這些簡單的知識點也是日后開發(fā)中會經(jīng)常遇到的,這里把這些東西掌握好了,等日后開發(fā)時也會感到很輕松。希望大家能從這篇博文中學(xué)到一定的知識,同時也希望大家對我的博客提一些中肯的建議。

相關(guān)文章

  • c++中引用和指針的區(qū)別和聯(lián)系

    c++中引用和指針的區(qū)別和聯(lián)系

    許多人對于引用和指針的區(qū)別與聯(lián)系很糾結(jié)(包括我在內(nèi)O(∩_∩)O哈哈~),最近看到一篇關(guān)于引用和指針區(qū)別和聯(lián)系的文章,感覺茅塞頓開,在這里和大家分享下
    2014-04-04
  • C++實現(xiàn)LeetCode(70.爬樓梯問題)

    C++實現(xiàn)LeetCode(70.爬樓梯問題)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(70.爬樓梯問題),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++日期類計算器的模擬實現(xiàn)舉例詳解

    C++日期類計算器的模擬實現(xiàn)舉例詳解

    兩個日期之間相隔天數(shù)的計算網(wǎng)上有許多的軟件,這里主要介紹如何使用C/C++語言來完成這樣的功能,下面這篇文章主要給大家介紹了關(guān)于C++日期類計算器的模擬實現(xiàn),需要的朋友可以參考下
    2023-04-04
  • C++17結(jié)構(gòu)化綁定的實現(xiàn)

    C++17結(jié)構(gòu)化綁定的實現(xiàn)

    這篇文章主要介紹了C++17結(jié)構(gòu)化綁定的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解C語言fscanf函數(shù)讀取文件教程及源碼

    詳解C語言fscanf函數(shù)讀取文件教程及源碼

    這篇文章主要為大家介紹了詳解C語言算法fscanf讀取文件示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 用C語言程序判斷大小端模式

    用C語言程序判斷大小端模式

    本文介紹了用C語言程序判斷大小端的方法,與大家分享一下。
    2013-04-04
  • C++?opencv圖像平滑濾波器使用示例

    C++?opencv圖像平滑濾波器使用示例

    這篇文章主要為大家介紹了C++?opencv數(shù)字圖像處理圖像平滑濾波器的使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C++11右值引用和移動語義的實例解析

    C++11右值引用和移動語義的實例解析

    左值和右值都是針對表達式,左值是指表達式結(jié)束后依然存在的持久對象,右值是指表達式結(jié)束時就不再存在的臨時對象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動語義的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題

    C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題

    這篇文章主要介紹了C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言變長數(shù)組 struct中char data[0]的用法詳解

    C語言變長數(shù)組 struct中char data[0]的用法詳解

    下面小編就為大家?guī)硪黄狢語言變長數(shù)組 struct中char data[0]的用法詳解。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論