#include<iostream>
using namespace std;
struct IUnknown
{
public:
virtual long QueryInterface(string& s, void ** ppv) = 0;
};struct IA :public IUnknown
{
public:
virtual void Ax() = 0;
virtual void Ay() = 0;
};struct IB:public IUnknown
{
public:
virtual void Bx() = 0;
virtual void By() = 0;
};class CA :public IA,public IB
{
public:
void Ax(){cout<<"AX"<<endl;}
void Ay(){cout<<"AY"<<endl;}
void Bx(){cout<<"BX"<<endl;}
void By(){cout<<"BY"<<endl;}
};
long CA::QueryInterface(string &s,void **ppv)
{
if(s == "IA")
*ppv = static_cast<IA*>(this);

else if(s == "IB")
*ppv = static_cast<IB*>(this);

else if(s == "IUnknown")
*ppv = static_cast<IA*>(this);
else
{
*ppv =NULL;
return FALSE;
}
return TRUE;
}
CA *CreateInstance()
{
CA *pCA = new CA;
return static_cast<IA*>(pCA);
}
void Test(void **pt)
{
static_cast<CA*>(*pt);
}
int main(int argc, char* argv[])
{
IA *p = CreateInstance();
Test((void**)&p);
p->By();
return 0;
}编译提示QueryInterface有2义性,但是为什么用com里自带的IUnknown就没有这个问题呢?

解决方案 »

  1.   

    #include <iostream>
    using namespace std;
    struct IUnknown
    {
    public:
    virtual long QueryInterface(string& s, void ** ppv) = 0;
    void Add(){return ;}
    };struct IA :public IUnknown
    {
    public:
    virtual void Ax() = 0;
    virtual void Ay() = 0;
    };struct IB:public IUnknown
    {
    public:
    virtual void Bx() = 0;
    virtual void By() = 0;
    };class CA :public IA,public IB
    {
    public:
    void Ax(){cout<<"AX"<<endl;}
    void Ay(){cout<<"AY"<<endl;}
    void Bx(){cout<<"BX"<<endl;}
    void By(){cout<<"BY"<<endl;}
    virtual long QueryInterface(string& s, void ** ppv);
    };long CA::QueryInterface(string &s,void **ppv)
    {
    if(strcmp(s.c_str(), "IA") == 0)
    *ppv = static_cast<IA*>(this);

    else if(strcmp(s.c_str(), "IB") == 0)
    *ppv = static_cast<IB*>(this);

    else if(strcmp(s.c_str(), "IUnknown") == 0)
    *ppv = static_cast<IA*>(this);
    else
    {
    *ppv =NULL;
    return 0;
    }
    return 1;
    }
    IUnknown *CreateInstance()
    {
    CA *pCA = new CA;
    return static_cast<IA*>(pCA);
    }int main(int argc, char* argv[])
    {
    IUnknown *p = CreateInstance(); string s = "IB";
    IB *pIB = NULL;
    if(p->QueryInterface(s, (void**)&pIB))
    pIB->By();
    return 0;
    }已经搞定,但是有疑问
    为什么把IUnknown改成1个非纯虚基类就可以了呢???
      

  2.   

    不是啦,是你的CA少QueryInterface()的申明
    class CA :public IA,public IB
    {
    public:
    void Ax(){cout<<"AX"<<endl;}
    void Ay(){cout<<"AY"<<endl;}
    void Bx(){cout<<"BX"<<endl;}
    void By(){cout<<"BY"<<endl;}
    //virtual long QueryInterface(string& s, void ** ppv);
    };