1

最近我研究了《Inside COM》这本书,我找到了一个代码示例,如下所示:接口定义为结构。IX 和 IY 继承了 IUnknown。CA 类继承 IX 和 IY。据我所知,在这种情况下CA应该有两个虚点指向虚函数,一个属于IX,另一个属于IY?

Interface IUnknown  
{
    virtual void QueryInterface() = 0;         
    virtual void AddRef() = 0  
    virtual void Release() = 0;  
};

Interface IX : IUnknown
{
     void X()
     {
        printf("X()\n");
     }
};

Interface IY : IUnknown
{
     void Y()
     {
        printf("Y()\n");
     }
};

class CA : public IX, public IY
{
    public:
    void QueryInterface()
    {
        printf("QueryInterface()\n");
    }

    void AddRef()   
    {
        printf("AddRef()\n");
    }

    void Release()
    {
        printf("Release()\n");
    }
};

我的问题是为什么 CA 只实现了 QueryInterface()、AddRef()、Release() 并且代码可以工作。为什么不存在QueryInterface()、AddRef()、Release()的实现是属于IX还是属于IY的模棱两可的问题。

谢谢。

4

1 回答 1

1

在派生类中声明的函数将覆盖在任何基类中声明的任何匹配的虚函数。因此,例如,CA::QueryInterface()将覆盖IUnknown::QueryInterface()可通过两个基类子对象访问的。

如果两者都覆盖它并且没有覆盖它,IX并且您尝试通过对. 在这种情况下,有两个潜在的重载,没有理由更喜欢任何一个。详细地:IYCACA

Interface IX : IUnknown
{
     void QueryInterface() { /* do something */ }
};

Interface IY : IUnknown
{
     void QueryInterface() { /* do something else */ }
};

class CA : public IX, public IY 
{
    // inherits both IX::QueryInterface and IY::QueryInterface
};

CA c;
c.QueryInterface();     // ERROR: which QueryInterface is that?
c.IX::QueryInterface(); // OK: specified unambiguously
于 2012-07-03T16:57:35.703 回答