__interface
Konkrétní společnosti Microsoft
Visual C++ rozhraní lze definovat takto:
Může dědit z nula nebo více základních rozhraní.
Nelze zdědit ze základní třídy.
Může obsahovat pouze veřejné, čistý virtuální metody.
Nemohou obsahovat konstruktory, destruktory nebo operátorů.
Statické metody nemohou obsahovat.
Nemůže obsahovat data členů; vlastnosti jsou povoleny.
modifier __interface interface-name {interface-definition};
Poznámky
C++ třídy nebo struct se provádí podle těchto pravidel, ale __interface je vynucuje.
Například je definice rozhraní vzorku:
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Informace o spravovaných rozhraní, viz rozhraní třídy.
Oznámení, že není nutné explicitně naznačují, že CommitX a get_X funkce jsou čisté virtuální.Deklarace rovnocenné pro první funkce by:
virtual HRESULT CommitX() = 0;
__interfacepředpokládá novtable__declspec modifikátor.
Příklad
Následující příklad ukazuje, jak použít vlastnosti deklarována v rozhraní.
// 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);
}