C++ COM-避免重复实现IUnknown

C++ COM-避免重复实现IUnknown,c++,windows,internet-explorer,inheritance,com,C++,Windows,Internet Explorer,Inheritance,Com,我正在尝试为Internet Explorer实现一个基本的浏览器帮助对象。我有两个类,一个必须实现IClassFactory,另一个必须实现IObjectWithSite。这两个接口都继承自IUnknown。为了避免重复实现IUnknown,我创建了一个未知基类,这样对于给定的子类,我只需要实现它的直接父接口。以下是我的类声明: class Child1 : public Unknown<IObjectWithSite> class Child2 : public Unknown

我正在尝试为Internet Explorer实现一个基本的浏览器帮助对象。我有两个类,一个必须实现IClassFactory,另一个必须实现IObjectWithSite。这两个接口都继承自IUnknown。为了避免重复实现IUnknown,我创建了一个未知基类,这样对于给定的子类,我只需要实现它的直接父接口。以下是我的类声明:

class Child1 : public Unknown<IObjectWithSite>

class Child2 : public Unknown<IClassFactory>

template <class T>
class Unknown : public T
在Unknown中,我实现了它将从T继承的IUnknown方法

我好像没法让它工作。我是不是遗漏了什么?我走错方向了吗

编辑:下面是代码

未知

#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...
    }

};
儿童1.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...

您应该将子类声明更改为:

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和Unknown是不同的类型,并实现了IUnknown。

是的,您的做法是错误的。使用ATL。花时间编写功能,而不是重新实现IUnknown和IClassFactory。

我似乎无法让这项功能发挥作用意味着什么?它不编译吗?它不跑了?你看到了什么错误?很多。我得到的第一个构建错误是指向Child2的定义,即使用类模板需要模板参数列表。您应该发布原始代码,即发布问题时的代码,并告诉哪一行出现了错误。还要注意的是,这并不是真正解决任何diamong问题,它只是避免您反复实现IUnknown的方法。然而,您似乎希望在子类中覆盖QueryInterface,因此它只会避免您重新实现AddRef和Release。所以我想从一个简单的方法开始,更好地理解COM。链接,例如到现有IUnknown的链接,和示例会使答案更好。对。在我的实现中,我指定了实际的类型参数?像Child1::myMethod。默认构造函数会在这里工作吗?好的,我已经试过了,但是运气不好。我在头文件中声明了Unknown,并将其包含在Child1和Child2声明的头文件中。由于这3个类是模板,所以实现也包含在头文件中。我仍然不知道:使用类模板需要模板参数列表,即使Child1和Child2是这样声明的:模板类Child1:public Unknown我已经用现在包含的代码编辑了这个问题。我有两个子类,因为我需要实现IUnknown之外的其他接口。为什么我不需要它们?另外,当我实现方法时,我当然需要传递类型参数的实际参数?Child1和Child2不必是模板。Boon,请考虑发布原始代码,而不是模板版本。
Unknown<IObjectWithSite> child1;
Unknown<IClassFactory> child2;