1

最近、私は「Inside COM」という本を研究しましたが、以下の部分のコードサンプルを見つけました。インターフェイスは構造体として定義されています。IXとIYはIUnknownを継承します。CAクラスはIXとIYを継承します。私の知る限り、この場合、CAは仮想関数への2つの仮想ポイントを持つ必要があります。1つはIXに属し、もう1つは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との両方IYがそれをオーバーライドし、オーバーライドしなかった場合、あいまいさが生じ、CAへの参照を介して呼び出そうとしましたCA。その場合、どちらを優先する理由もない 2 つの潜在的な過負荷があります。詳細に:

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 に答える