#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就没有这个问题呢?
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就没有这个问题呢?
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个非纯虚基类就可以了呢???
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);
};