QueryInterface的2义性问题!

yuantao 2004-08-07 08:54:18
#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就没有这个问题呢?
...全文
85 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuantao 2004-08-10
  • 打赏
  • 举报
回复
是啊,谁能解释一下这其中的原理吗,肯定跟c++对多重继承的处理有关系
captainwh 2004-08-07
  • 打赏
  • 举报
回复
应该是由于多重继承导致的问题吧
yuantao 2004-08-07
  • 打赏
  • 举报
回复
#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个非纯虚基类就可以了呢???
Cline 2004-08-07
  • 打赏
  • 举报
回复
不是啦,是你的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);
};

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧