亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-01-26 15:17:08
字體:
來源:轉載
供稿:網友

什么是接口?

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

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

接口的好處

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

在實際開發時,你并不需要去理會組件的實現細節,你面對的是接口,面對接口工作。即使組件的開發者將組件的實現替換掉了,而接口不變,你的程序也不需要變動。接口,就像一個標準一樣,讓我們去遵從這個標準。之前做的一個項目就是替換一個組件的實現層,而對于接口,則不需要進行變更。

簡單的實現

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

復制代碼 代碼如下:

/*
** FileName     : SimpleInterfaceDemo
** Author       : Jelly Young
** Date         : 2013/12/11
** Description  : More information, please go to //www.49028c.com
*/
#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上面代碼的關鍵之處在于:

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

細節剖析

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

復制代碼 代碼如下:

#define __STRUCT__ struct
#define interface __STRUCT__

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

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

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91成人在线观看国产| 日韩在线小视频| 国内精品视频久久| 米奇精品一区二区三区在线观看| 91大神在线播放精品| 国外视频精品毛片| 久久久精品视频在线观看| 久久99久久亚洲国产| 亚洲精品www久久久久久广东| 富二代精品短视频| 91av视频在线免费观看| 九九九久久久久久| 日韩av在线免播放器| 日韩有码在线观看| 精品一区二区三区四区在线| 欧美精品久久一区二区| 日韩av在线高清| 国产精品日韩在线| 久久91亚洲精品中文字幕| 国产香蕉97碰碰久久人人| 亚洲成av人乱码色午夜| 色婷婷综合成人av| 精品久久久中文| 中文字幕免费精品一区高清| 精品人伦一区二区三区蜜桃网站| 午夜精品一区二区三区在线视| 久久99精品久久久久久琪琪| 最近2019中文字幕一页二页| 国产精品一区二区三区久久| 中文字幕日韩欧美| 国产精品久久久久aaaa九色| 成人激情视频小说免费下载| 成人福利视频网| 福利一区福利二区微拍刺激| 欧美又大粗又爽又黄大片视频| 亚洲欧洲第一视频| 国产欧美欧洲在线观看| 精品少妇v888av| 97免费视频在线播放| 国产亚洲aⅴaaaaaa毛片| 亚洲午夜性刺激影院| 国产精品久久久久久久久免费看| 亚洲美女av在线播放| 欧美乱人伦中文字幕在线| 91精品中国老女人| 欧美一区深夜视频| 欧美老女人www| 一本大道久久加勒比香蕉| 亚洲第一级黄色片| 国产99久久精品一区二区| 欧美国产精品人人做人人爱| 97免费中文视频在线观看| 午夜精品久久久久久久白皮肤| 欧洲精品久久久| 欧美在线性视频| 亚洲综合自拍一区| 91精品久久久久久| xvideos亚洲人网站| 深夜福利国产精品| 欧美大片va欧美在线播放| 久久久亚洲天堂| 55夜色66夜色国产精品视频| 亚洲精品91美女久久久久久久| www.日韩系列| 欧美一二三视频| 欧美在线观看日本一区| 最近中文字幕2019免费| 亚洲黄一区二区| 国产精品色悠悠| 欧美高清视频免费观看| 亚洲风情亚aⅴ在线发布| 欧美劲爆第一页| 在线不卡国产精品| 亚洲精品视频在线观看视频| 国产精品久久久久9999| 欧美高清视频免费观看| 国产一区二区在线免费视频| 国产91免费看片| 亚洲精品第一国产综合精品| 欧美专区日韩视频| 91在线|亚洲| 国产成人综合一区二区三区| 亚洲一区二区三区sesese| 92福利视频午夜1000合集在线观看| 国产丝袜一区二区三区| 亚洲一级免费视频| 欧美自拍视频在线观看| 欧美高清理论片| 精品激情国产视频| 国产精品va在线播放| 国产999精品久久久| 亚洲精品www久久久久久广东| 国产91在线播放九色快色| 亚洲美女性生活视频| 国产精品美女主播| 国产女人精品视频| 亚洲一品av免费观看| 91久久久在线| 久久精品国产视频| 日本19禁啪啪免费观看www| 中文字幕日韩在线观看| 68精品国产免费久久久久久婷婷| 国产香蕉97碰碰久久人人| 国产亚洲精品久久久久久| 国产精品久久久久久久久久99| 成人免费高清完整版在线观看| 欧美丰满老妇厨房牲生活| 亚洲高清免费观看高清完整版| 国产日韩精品视频| 亚洲国产另类 国产精品国产免费| 日本在线精品视频| 亚洲欧美日韩国产成人| 欧美在线视频播放| 国产成人一区二区三区小说| 成人网在线免费观看| 日韩精品免费综合视频在线播放| 国产欧美va欧美va香蕉在线| 亚洲成年人在线播放| 日韩欧美国产骚| 国产欧美va欧美va香蕉在线| 国内精品视频一区| 亚洲欧美日韩中文在线制服| 欧美大荫蒂xxx| 久久久之久亚州精品露出| 青青精品视频播放| 亚洲精品久久久久久下一站| 国产精品美女av| 日韩在线中文字| 欧美乱人伦中文字幕在线| 亚洲加勒比久久88色综合| 亚洲精品一区二区三区婷婷月| www.色综合| 国产精品色婷婷视频| 中文字幕亚洲欧美日韩2019| 91九色单男在线观看| 欧美黑人一级爽快片淫片高清| 欧美激情亚洲自拍| 亚洲成av人影院在线观看| 一本色道久久88亚洲综合88| 欧美国产视频日韩| 国内精品伊人久久| 97热精品视频官网| 高清日韩电视剧大全免费播放在线观看| www.日韩视频| 国产精品日韩在线播放| 久久久久久久久久久成人| 亚洲国产美女久久久久| 国产精品视频一区二区高潮| 国产精品扒开腿做爽爽爽的视频| 欧美天天综合色影久久精品| 成人网在线免费观看| 亚洲男子天堂网| 91精品国产综合久久香蕉最新版| 久久99视频免费| 久久综合久久八八| 国产精品a久久久久久| 亚洲人成在线观看| 亚洲成人激情小说| 精品久久久中文| 国产精品中文在线| 欧美精品在线第一页| 45www国产精品网站| 精品久久久久久久久久ntr影视| 亚洲欧美精品suv|