潘安民com原理与应用聚合哪一张的例子没有看明白 106页倒数7行,
书上所说所得到的是非委托的IUnKnown接口的指针,再通过这个指针去查找
ISomeInterface接口,这里我有两点没有看明白, 1.非委托接口INondelegatingUnknown 没有queryInterface(....)的定义,
只有委托接口定义了,我想如果要使用queryInterface(...)是不是在接口指针处转换一下就如 (IUnKnown *)pnodelegnt->queryInterface(.......);
2.如果书上代码是正确的,因为书上所实现queryInterface()的是委托接口,
queryInterface(..)的实现是判断是不是聚合,如是不是就交给非委托的接口查询
函数,否则是则根据聚合原理丢给外面的接口对象的queryInterface(..)处理,
但看书上代码外面接口对象的queryInterface(...)实际上是丢给Init时所产业的聚合对象的queryInterface(..)去处理,就是说,绕了个圈子又回到最先qureryInterface(..)的地方了,我想应该是我哪理解有问题,请指点一二
书上所说所得到的是非委托的IUnKnown接口的指针,再通过这个指针去查找
ISomeInterface接口,这里我有两点没有看明白, 1.非委托接口INondelegatingUnknown 没有queryInterface(....)的定义,
只有委托接口定义了,我想如果要使用queryInterface(...)是不是在接口指针处转换一下就如 (IUnKnown *)pnodelegnt->queryInterface(.......);
2.如果书上代码是正确的,因为书上所实现queryInterface()的是委托接口,
queryInterface(..)的实现是判断是不是聚合,如是不是就交给非委托的接口查询
函数,否则是则根据聚合原理丢给外面的接口对象的queryInterface(..)处理,
但看书上代码外面接口对象的queryInterface(...)实际上是丢给Init时所产业的聚合对象的queryInterface(..)去处理,就是说,绕了个圈子又回到最先qureryInterface(..)的地方了,我想应该是我哪理解有问题,请指点一二
不过就是内部的实现分了委托和非委托两个东西而已。
你这样理解,INondelegatingUnknown是给聚合对象调用的,而IUnknown是给客户调用的!!!被聚合的对象把客户对IUnknown调用转发给聚合对象
2.外部对象含有一个指向内部NonDelegatingIUnknown的指针,调用m_pInnerUnknown的QueryInterface就是调用NonDelegatingIUnknown的NonDelegatingQueryInterface,因为两个IUnknown的内存结构是一样的,非代理的转成一般的,所以QI也转了
QeuryInterface(Isome,**p)
{ if(pOUt) //是聚合
pOut->QueryInterface(iSome,**p) //给到外面处理
//但外面处理isome这个接口
//实际上又交给外部包含的内部
//聚合对象的QueryInterface()处
//理,就又到这里面来了, else
NonDelegatinQuerry(iSome,**p);
}
if(pOUt) //是聚合
pOut->QueryInterface(iSome,**p) \\在这里是传给m_pOurUnknown(被聚合类的成员),也就是外面的IUnknown,如果还是请求被聚合的接口,那么再传给m_pInnerUnknown(聚合类的成员,即指向被聚合类的NonDelegatingUnknonw)
好好理解一下
,我是说外面的IUnKnown中的QuerryInterface()是这么写的
QueryInterface()
{
。。
。
if(riid==ISome)
m_pInnerUnknown->QueryfaceInterface(...)//这一句不是又到了上面哪个QueryInterface()中去了嘛,不就成了循球,在里面的QueryInterface一看是聚合就传出来,外面一看是riid是ISome又传进去 ,所以说我还是没有明白,呵呵,你在讲一遍吧
。}
m_pInnerUnknown是指向NonDelegatingUnknown的,不是指向IUnknown
所以它调用QueryInterface其实是调用NonDelegatingQueryInterface
如果还不明白就把书看两遍,希望熟能生巧吧