【发布时间】:2015-02-08 23:23:43
【问题描述】:
我正在尝试为 Internet Explorer 实现一个基本的浏览器帮助对象。我有 2 个类,一个必须实现 IClassFactory,一个必须实现 IObjectWithSite。这两个接口都继承自 IUnknown。为了避免重复实现 IUnknown,我创建了一个基类 Unknown,这样对于给定的子类,我只需要实现它的直接父接口。这是我的班级声明:
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 方法。
我似乎无法让它工作。我在这里错过了什么吗?我是不是走错路了?
编辑:这是下面的代码
未知.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...
孩子2:
#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...
【问题讨论】:
-
“我似乎无法让它工作”是什么意思?它不编译?它不运行?您看到了什么错误?
-
很多。我得到的第一个构建错误是指向 Child2 的定义,说“使用类模板需要模板参数列表”。
-
您应该发布您的原始代码,即您发布问题时所拥有的代码,并说明哪一行给出了错误。另请注意,这并不能真正解决任何问题,它只是避免您一遍又一遍地实现
IUnknown的方法。但是,您似乎想在子类中覆盖QueryInterface,因此它只会避免您重新实现AddRef和Release。
标签: c++ windows internet-explorer inheritance com