Inheritance 关于在C++;

Inheritance 关于在C++;,inheritance,struct,c++-cli,Inheritance,Struct,C++ Cli,最近,我研究了一本书“Inside COM”,我发现了一个代码示例,如下所示: 接口被定义为struct。 IX和IY继承了IUnknown。 CA类继承IX和IY。 据我所知,在这种情况下,CA应该有两个指向虚拟函数的虚拟点,一个属于IX,另一个属于IY Interface IUnknown { virtual void QueryInterface() = 0; virtual void AddRef() = 0 virtual void R

最近,我研究了一本书“Inside COM”,我发现了一个代码示例,如下所示: 接口被定义为struct。 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这一模棱两可的问题不存在呢


谢谢。

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

如果
IX
IY
都覆盖它,而
CA
没有覆盖它,并且您试图通过对
CA
的引用调用它,那么您将得到一个歧义。在这种情况下,有两种可能的重载,没有理由选择其中一种。详细内容:

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

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

如果
IX
IY
都覆盖它,而
CA
没有覆盖它,并且您试图通过对
CA
的引用调用它,那么您将得到一个歧义。在这种情况下,有两种可能的重载,没有理由选择其中一种。详细内容:

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

谢谢你的回答。请你解释一下“在这种情况下,有两种可能的过载,没有理由选择其中一种”是什么意思?谢谢..@Weber:我已经添加了更多的细节。但这与你的问题并不相关;这只是一个例子,说明在与你类似的情况下,歧义是如何发生的。谢谢你的回答。请你解释一下“在这种情况下,有两种可能的过载,没有理由选择其中一种”是什么意思?谢谢..@Weber:我已经添加了更多的细节。但这与你的问题并不相关;这只是一个例子,说明在与您类似的情况下可能会出现歧义。您应该删除c++/cli标记…您应该删除c++/cli标记。。。