我正在尝试为Internet Explorer实现一个基本的浏览器帮助对象。我有两个类,一个必须实现IClassFactory,另一个必须实现IObjectWithSite。这两个接口都继承自IUnknown。为了避免重复实现IUnknown,我创建了一个未知的基类,这样对于给定的子类,我只需要实现它的直接父接口。下面是我的类声明:
class Child1 : public Unknown<IObjectWithSite>
class Child2 : public Unknown<IClassFactory>
template <class T>
class Unknown : public T我这样做是为了避免钻石问题。
Child1 ---> Unknown ---> IObjectWithSite
Child2 ---> Unknown ---> IClassFactory在Unknown中,我实现了它将从T继承的IUnknown方法。
我好像不能让它起作用。我是不是漏掉了什么?我是不是走错路了?
编辑:下面是代码
Unknown.h
#pragma once
#include <OCIdl.h>
#include <Unknwn.h>
template <class T>
class Unknown : public T
{
protected:
// Reference count to this COM class
ULONG m_comRef;
public:
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
{
// Implementation...
}
STDMETHODIMP_(ULONG) AddRef()
{
// Implementation...
}
STDMETHODIMP_(ULONG) Release()
{
// Implementation...
}
};Child1.h
#pragma once
#include "Unknown.h"
template <class T>
class Child1 : public Unknown<T>
{
public:
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject);
};
STDMETHODIMP Child1<IClassFactory>::QueryInterface(REFIID riid, void** ppvObject) {
// implementation...
}
etc...Child2:
#pragma once
#include "Unknown.h"
template <class T>
class Child2 : public Unknown<T>
{
public:
STDMETHODIMP SetSite(IUnknown*);
STDMETHODIMP GetSite(REFIID, void**);
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject);
};
STDMETHODIMP Child2<IObjectWithSite>::SetSite(IUnknown*) {
// Implementation...
}
etc...发布于 2014-12-11 01:53:39
您应该将子类声明更改为:
template <class T>
class Child1 : public Unknown<T>您正在类声明中实例化父模板,这是不允许的。
在函数实现中,您仍然需要使用T:
template <class T>
STDMETHODIMP Child2<T>::SetSite(IUnknown*) {
// Implementation...
}对于你的问题,你不需要声明2个子类,你可以简单地使用:
Unknown<IObjectWithSite> child1;
Unknown<IClassFactory> child2;在实例化模板时,编译器会创建一个新类型,因此Unknown<IObjectWithSite>和Unknown<IClassFactory>是实现了IUnknown的不同类型。
发布于 2014-12-11 03:21:20
是的,你做错了。使用ATL。把时间花在编写功能上,而不是重新实现IUnknown和IClassFactory。
https://stackoverflow.com/questions/27406552
复制相似问题