c++虛函數, 介面, 抽象類別

來源:互聯網
上載者:User

c++的抽象類別可以作為介面,實現事件回調等機制.

介面實現檔案IDemoImpl.cpp

#include <stdio.h>#include "IDemo.h"IDemo::IDemo(){}IDemo::~IDemo(){}class CDemoImpl : public IDemo{public:CDemoImpl(){};~CDemoImpl(){};public:virtual int Add(int a, int b){return (a+b);}virtual int Sub(int a, int b){return (a-b);}};IDemo * GetInstance(void){return new CDemoImpl();}

介面檔案IDemo.h

#ifndef _IDEMO_H_#define _IDEMO_H_class IDemo{public:IDemo();virtual ~IDemo();public:virtual int Add(int, int) = 0;virtual int Sub(int, int) = 0;};IDemo * GetInstance(void);#endif

對象的用戶端可以這樣調用

#include "IDemo.h"int main(void){    IDemo * pDemo = GetInstance();    printf("%d\n", pDemo->Add(1,2));}

如果把IDemoImpl.cpp編譯到dll或者so裡面,然後只發布介面檔案IDemo.h和二進位的實現,就有了一點com的雛形了。

這個GetInstance()還是太簡單了,如果可以改成更具某個id去指定擷取不同的對象,

比如GetInstance(const char * uuid), 那麼這個函數就有了一些ms的IUnkown介面的QueryInterface()的意思了。

HRESULT QueryInterface(  [in]   REFIID riid,  [out]  void **ppvObject);

參考QueryInterface的樣子,實現一個GetInstance()

void * GetInstance(const char * uuid){      if (!strcmp(uuid, "uuid_add")          return new CDemoAddImpl();      if (!strcmp(uuid, "uuid_sub")          return new CDemoSubImpl();      return (void *) 0;}

修改一個新的IDemo.h

#ifndef _IDEMO_H_#define _IDEMO_H_#ifdef __cplusplusextern "C"{#endifvoid * GetInstance(const char * uuid);#ifdef __cplusplus};#endif#endif

分開不同功能的介面定義

IDemoAdd.h

#ifndef  _IDEMO_ADD_H_#define  _IDEMO_ADD_H_class IDemoAdd{public:IDemoAdd();virtual ~IDemoAdd();public:virtual int Add(int, int) = 0;}#endif

IDemoSub.h

#ifndef  _IDEMO_SUB_H_#define  _IDEMO_SUB_H_class IDemoSub{public:IDemoSub();virtual ~IDemoSub();public:virtual int Sub(int, int) = 0;}#endif

分別在2個cpp檔案裡面用CDemoAddImpl類和CDemoSubImpl類, 來實現Add()和Sub()方法(略)

然後把實現的cpp編譯成二進位的dll或者so檔案,連同3個標頭檔(IDemo.h IDemoAdd.h IDemoSub.h)一起發布給用戶端。

用戶端調用可以這樣:

#include <stdio.h>#include "IDemo.h"#include "IDemoAdd.h"#include "IDemoSub.h"int main(void){    IDemoAdd * pAdd = GetInstance("uuid_add");    if (pAdd)        pAdd->Add(1,2);    IDemoSub * pSub = GetInstance("uuid_sub");        pSub->Sub(1,2);      return 0;}

總結一下:

com的基本思想就是公開對象介面(標頭檔),但是隱藏對象介面實現的細節(二進位庫)。通過這些介面定義,用戶端可以在二進位的層面像搭積木一樣mashup出來新的軟體,進而達到軟體複用的目的.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.