__interface
Específicos do Microsoft
Uma interface Visual C++ pode ser definida da seguinte maneira:
Pode herdar de interfaces de base zero ou mais.
Não pode herdar de uma classe base.
Só pode conter métodos virtuais públicos, puros.
Não podem conter construtores, destrutores ou operadores.
Não pode conter métodos estáticos.
Não pode conter membros de dados; propriedades são permitidas.
modifier __interface interface-name {interface-definition};
Comentários
Um C++ classe ou struct poderia ser implementado com essas regras, mas __interface impõe-los.
Por exemplo, este é um exemplo de definição de interface:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Para obter informações sobre interfaces gerenciadas, consulte classe de interface.
Observe que você precisa indicar explicitamente que o CommitX e get_X funções são essencialmente virtual.Uma declaração equivalente para a primeira função seria:
virtual HRESULT CommitX() = 0;
__interfaceimplica a novtable__declspec modificador.
Exemplo
O exemplo a seguir mostra como usar propriedades declaradas na 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);
}