Невозможно наследовать от COM-классов, как вы можете в C ++.Однако есть обходные пути:
Агрегаты COM полезны, только если вы хотите добавить интерфейс (с реализацией) к существующему классу COM.Вы не можете перехватывать вызовы к агрегированному объекту.
Переадресация означает, что если у вас есть интерфейс IExistingInterface
, вы реализуете свой собственный класс, который реализует IExistingInterface
.В вашем классе вы сохраняете ссылку на экземпляр объекта, от которого хотите «наследовать».В вашей реализации IExistingInterface
вы перенаправляете вызовы в соответствии с «унаследованным» объектом.Этот метод дает вам полный контроль.
Пример: (псевдокод!)
class MyClass : IExistingInterface {
IExistingInterface* m_pInherited;
public:
MyClass() {
::CoCreateInstance(CLSID_OtherImplementation, ..., ..., IID_IExistingInterface, (void**)&m_pInherited);
}
// IExistingInterface methods
HRESULT MethodX() {
// Do some pre processing
HRESULT hr = m_pInherited->MethodX();
if(FAILED(hr))
return hr;
// Do some post processing
return S_OK;
}
};
Редактировать: Я действительно рекомендую использовать ATL для создания COM-компонента.,В этом случае создайте «унаследованный» объект в FinalConstruct()
, а не в конструкторе C ++.