http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=45135&forum_id=34

解决方案 »

  1.   

    "m_pUnknowInner->QueryInterface(IID_ISomeInterface,(void **)&m_pSomeInterface)
    调用的是NondelegatingQueryInterface,这个我也实在搞不懂。"m_pUnknownInner是指向NonDelegatingUnknown的,没错
    但是它在赋给m_pUnknown的时候已经被强制类型转换成IUnknown了
    所以它可以调用QueryInterface,其实调用的是NonDelegatingQueryInterface
      

  2.   

    to:luohualiushui(落花流水) 所以它可以调用QueryInterface,其实调用的是NonDelegatingQueryInterface为什么它刚好调用NonDelegatingQueryInterface,而不是其他的函数呢?
      

  3.   

    它们的内存结构一样,
    你可以认为QueryInterface和NonDelegatingQueryInterface在一个位置
      

  4.   

    #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(落花流水)说得对。。
      

  5.   

    dexo兄,看了这样的解答我很高兴您的例子要表达的意思是ia这里代表INonDelegatingUnknown,ib代表的是IUnknow
    这里因为pia是指向的INonDelegatingUnknown,所以在强制转换它为ib(ie.IUnknow时)
    虽然是调用的fb2(好象是QueryInterface),但是实际上还是调用的NondelegationUnknow
    现在问题解决了,呵呵,爽这里高人就是多,谢谢了!dexo和luohualiushui兄