__interface

__interface

Visual Studio 2015

在原版语言设计中,一个接口类型是用关键字 __interface指明的。在修订版语言中,它被 interface class替代。

Microsoft Specific**

A Visual C++ interface can be defined as follows:

  • Can inherit from zero or more base interfaces.

  • Cannot inherit from a base class.

  • Can only contain public, pure virtual methods.

  • Cannot contain constructors, destructors, or operators.

  • Cannot contain static methods.

  • Cannot contain data members; properties are allowed.

 

Syntax

  
 modifier  
  __interface interface-name {interface-definition};  

 

Remarks

A C++ class or struct could be implemented with these rules, but __interface enforces them.

For example, the following is a sample interface definition:

 __interface IMyInterface {  
    HRESULT CommitX();  
    HRESULT get_X(BSTR* pbstrName);  
 };  

For information on managed interfaces, see interface class .

Notice that you do not have to explicitly indicate that the CommitX and get_X functions are pure virtual. An equivalent declaration for the first function would be:

 virtual HRESULT CommitX() = 0;  

__interface implies the novtable __declspec modifier.

 

Example

The following sample shows how to use properties declared in an interface.

 // deriv_interface.cpp  
 #define _ATL_ATTRIBUTES 1  
 #include <atlbase.h>  
 #include <atlcom.h>  
 #include <string.h>  
 #include <comdef.h>  
 #include <stdio.h>  
  
 [module(name="test")];  
  
 [ object, uuid("00000000-0000-0000-0000-000000000001"), library_block ]  
 __interface IFace {  
    [ id(0) ] int int_data;  
    [ id(5) ] BSTR bstr_data;  
 };  
  
 [ coclass, uuid("00000000-0000-0000-0000-000000000002") ]  
 class MyClass : public IFace {  
 private:  
     int m_i;  
     BSTR m_bstr;   
  
 public:  
     MyClass()  
     {  
         m_i = 0;  
         m_bstr = 0;  
     }  
  
     ~MyClass()  
     {  
         if (m_bstr)   
             ::SysFreeString(m_bstr);  
     }  
  
     int get_int_data()  
     {  
         return m_i;  
     }  
  
     void put_int_data(int _i)   
     {  
         m_i = _i;  
     }  
  
     BSTR get_bstr_data()  
     {   
         BSTR bstr = ::SysAllocString(m_bstr);  
         return bstr;   
     }  
  
     void put_bstr_data(BSTR bstr)   
     {   
         if (m_bstr)   
             ::SysFreeString(m_bstr);  
         m_bstr = ::SysAllocString(bstr);  
     }  
 };  
  
 int main()  
 {  
     _bstr_t bstr("Testing");  
     CoInitialize(NULL);  
     CComObject<MyClass>* p;  
     CComObject<MyClass>::CreateInstance(&p);  
     p->int_data = 100;  
     printf_s("p->int_data = %d\n", p->int_data);                
     p->bstr_data = bstr;  
     printf_s("bstr_data = %S\n", p->bstr_data);  
 }  

Output

 p->int_data = 100  
 bstr_data = Testing  

猜你喜欢

转载自blog.csdn.net/qq_41786318/article/details/82015038