__interface
Только для систем Microsoft
Интерфейс Visual C++ можно определить следующим образом:
Могут наследовать из нуля или более базовых интерфейсов.
Не удается наследовать от базового класса.
Может содержать только открытый, чисто виртуальные методы.
Не может содержать конструкторы, деструкторы или операторы.
Не может содержать статические методы.
Не может содержать элементы данных; свойства допускаются.
modifier __interface interface-name {interface-definition};
Заметки
C++ класс OR структура может быть реализован с этим правилам, но __interface применяет их.
Например, следующее определение интерфейса:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Дополнительные сведения об управляемых интерфейсов см. в разделе класс интерфейса.
Обратите внимание, что нет необходимости явно указать, что CommitX и get_X функции чисто виртуальный.Эквивалентное объявление для первой функции будет следующий раздел:
virtual HRESULT CommitX() = 0;
__interface неявно novtable __declspec модификатор.
Пример
В следующем образце показано, как использовать свойства, объявленные в интерфейсе.
// 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);
}