《COM原理与应用》一书中讲到聚合模式时的那个例子,我想了好久^^^^ http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=45135&forum_id=34 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 "m_pUnknowInner->QueryInterface(IID_ISomeInterface,(void **)&m_pSomeInterface)调用的是NondelegatingQueryInterface,这个我也实在搞不懂。"m_pUnknownInner是指向NonDelegatingUnknown的,没错但是它在赋给m_pUnknown的时候已经被强制类型转换成IUnknown了所以它可以调用QueryInterface,其实调用的是NonDelegatingQueryInterface to:luohualiushui(落花流水) 所以它可以调用QueryInterface,其实调用的是NonDelegatingQueryInterface为什么它刚好调用NonDelegatingQueryInterface,而不是其他的函数呢? 它们的内存结构一样,你可以认为QueryInterface和NonDelegatingQueryInterface在一个位置 #include <iostream> using namespace std;class ia{public: virtual fa1()=0; virtual fa2()=0;};class ib{public: virtual fb1()=0; virtual fb2()=0; virtual fb3()=0;};class ab:public ia,ib{public: virtual fa1(); virtual fa2(); virtual fb1(); virtual fb2(); virtual fb3();};#define ff(x) ab::x(){cout<<#x<<endl;return 0;}ff(fa1)ff(fa2)ff(fb1)ff(fb2)ff(fb3)void main(){ ia* pia= new ab; ((ib*)pia)->fb2();}在vc6中, 上面的输出为fa2,如果((ib*)pia)->fb2()改成((ib*)pia)->fb3(),运行时出错。luohualiushui(落花流水)说得对。。 dexo兄,看了这样的解答我很高兴您的例子要表达的意思是ia这里代表INonDelegatingUnknown,ib代表的是IUnknow这里因为pia是指向的INonDelegatingUnknown,所以在强制转换它为ib(ie.IUnknow时)虽然是调用的fb2(好象是QueryInterface),但是实际上还是调用的NondelegationUnknow现在问题解决了,呵呵,爽这里高人就是多,谢谢了!dexo和luohualiushui兄 读取pdf中文本的问题 整型数怎么存进字节数组 复制TXT文件到其它盘 获取hdc 如何删除Tree控件中变量中的数据? vc8不支持模板作参数吗? CDC与HDC 请问_bstr_t是什么东西?和LPTSTR兼容吗? 如何解压W2k安装文件 i386\*.DL_ 笨蛋问题 大虾看过来啊!我是新手!多多帮忙! 大家看看我这个问题怎么解决啊?狠简单,只不过我是初学者有点胡涂,请帮忙,谢谢.
调用的是NondelegatingQueryInterface,这个我也实在搞不懂。"m_pUnknownInner是指向NonDelegatingUnknown的,没错
但是它在赋给m_pUnknown的时候已经被强制类型转换成IUnknown了
所以它可以调用QueryInterface,其实调用的是NonDelegatingQueryInterface
你可以认为QueryInterface和NonDelegatingQueryInterface在一个位置
using namespace std;class ia
{
public:
virtual fa1()=0;
virtual fa2()=0;
};class ib
{
public:
virtual fb1()=0;
virtual fb2()=0;
virtual fb3()=0;
};class ab:public ia,ib
{
public:
virtual fa1();
virtual fa2(); virtual fb1();
virtual fb2();
virtual fb3();
};
#define ff(x) ab::x(){cout<<#x<<endl;return 0;}ff(fa1)
ff(fa2)
ff(fb1)
ff(fb2)
ff(fb3)
void main()
{
ia* pia= new ab;
((ib*)pia)->fb2();
}
在vc6中, 上面的输出为fa2,如果((ib*)pia)->fb2()改成((ib*)pia)->fb3(),运行时出错。
luohualiushui(落花流水)说得对。。
这里因为pia是指向的INonDelegatingUnknown,所以在强制转换它为ib(ie.IUnknow时)
虽然是调用的fb2(好象是QueryInterface),但是实际上还是调用的NondelegationUnknow
现在问题解决了,呵呵,爽这里高人就是多,谢谢了!dexo和luohualiushui兄