__interface
Spécifique à Microsoft
une interface de Visual C++ peut être définie comme suit :
Peuvent hériter de zéro ou plus de les interfaces de base.
ne peut pas hériter d'une classe de base.
Peut uniquement contenir le public, méthodes virtuelles pures.
ne peut pas contenir des constructeurs, des destructeurs, ou des opérateurs.
ne peut pas contenir des méthodes statiques.
ne peut pas contenir des données membres ; il permet des propriétés.
modifier __interface interface-name {interface-definition};
Notes
Le en C++ classe ou struct peut être implémenté avec ces règles, mais __interface les applique.
Par exemple, voici une définition d'interface exemple :
__interface IMyInterface {
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
Pour plus d'informations sur les interfaces managées, consultez le classe d'interface.
Notez que vous ne devez pas explicitement indiquer que les fonctions d' CommitX et d' get_X sont virtuelles pur.Une déclaration équivalente pour la première fonction est :
virtual HRESULT CommitX() = 0;
__interface implique le modificateur de novtable__declspec .
Exemple
L'exemple suivant montre comment utiliser les propriétés déclarées dans une 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);
}