首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

Coder_Y_Jao 大牛进,小弟我请问2个有关问题

2012-10-15 
Coder_Y_Jao 大牛进,我请教2个问题C/C++ code你好我, 我翻了不少老帖子, 发现你说的一段话,有些不懂,所以

Coder_Y_Jao 大牛进,我请教2个问题

C/C++ code
你好我, 我翻了不少老帖子, 发现你说的一段话,  有些不懂,所以再请问问题1:Coder_Y_Jao在一个老帖子里说:为了与语言无关的兼容性_stdcall是大多数语言都支持的调用约定,_thiscall则用于c++的成员函数,需要ECX存储this。你可能会问,COM都编译成二进制文件了,不都一样保证本身的功能正常,有什么关系呢。考虑下面的情况,一个不支持_thiscall的语言中,调用某个成员函数参数入栈后,是不可能将this存储在ecx的。而你编译好的COM(_thiscall)中,则使用这个ecx来间接操作其他成员等,这就导致了不兼容。而_stdcall则直接push this指针当做参数入栈,COM中也是_stdcall,不需要关心那个ecx,通过栈来间接操作就好了。 如果有一个 com的接口函数内部调用了 _thiscall或者其他 函数调用约定的 函数,那么又如何呢?问题2: com中的一个语法讨论class B:public  IOtherInterface{protected:ULONG m_Ref;B();  ~B();HRESULT _stdcall QueryInterface(const IID&iid, void** ppv);HRESULT _stdcall AddRef();HRESULT _stdcall Release();//other interface membersHRESULT _stdcall Otherfunction()p;HRESUTL  Inti();private:IUnkown* m_pUnkownInner;    };以下是 <com原理和应用 >一书提供的实现源码:HRESULT B: QueryInterface(const IID& iid, void** ppv){if(iid==IID_IUnkown){*ppv=(IUnkown*)this;        //转换(1)  ,孙子类指针转换为祖父类指针((IUnkown*)(*ppv)->AddRef();                }else if(iid==IID_OtherInterface){*ppv=(IOtherInterface*)this;    //转换是否多余 (2)((IOtherInterface*)(*ppv)->AddRef();    }else if(iid== IID_SomeInterface){return m_pUnkownInner->QueryInterface(iid,ppv);}else{*ppv=NULL;return E_NONTERFACE;}return S_OK;}(1)为什么孙子类的指针可以强行转换为祖父类的, 我记得,只可以转换为父亲类的指针吧?(2) 转换为父亲类的指针后,由于是虚函数,最终还是调用孙子类的 覆盖的虚函数, 所以 对于转换为(2)是否多余?


[解决办法]
我再说明白一点吧,在没有虚拟继承的菱形继承中,孙子类拥有两份祖父类拷贝,是不能直接转换的。
你的例子中没有这样的情况,而COM的多继承就有这样的情况,比如我2楼的代码:
reinterpret_cast< IUnknown* >(*ppv)->AddRef();就不能换成下面的代码
static_cast< IUnknown* >(this)->AddRef();

热点排行