大家知道win32中iunknown定义如下:
interface iuknown
{
virtual hresult _stdcall queryinterface(const iid& iid,void** ppv) =0;
virtual ulong _stdcall addref() = 0;
virtual ulong _stdcall release = 0;
};
可是在“com技术内幕”p31页中明确指出:
iunknown并不是虚拟基类,不能被虚拟继承,否则会导致与com不兼容的vtbl.如果一个组件从两个接口继承,如果Iunknown不用虚拟继承的话,那么会产生两个Iunknown了,这不是违背了一个组件一个Iunknown吗?
interface iuknown
{
virtual hresult _stdcall queryinterface(const iid& iid,void** ppv) =0;
virtual ulong _stdcall addref() = 0;
virtual ulong _stdcall release = 0;
};
可是在“com技术内幕”p31页中明确指出:
iunknown并不是虚拟基类,不能被虚拟继承,否则会导致与com不兼容的vtbl.如果一个组件从两个接口继承,如果Iunknown不用虚拟继承的话,那么会产生两个Iunknown了,这不是违背了一个组件一个Iunknown吗?
然后就是 被虚拟继承,否则会导致与com不兼容的vtbl 这句话讲的不兼容的Vtbl,是怎么回事呢?
虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如:
class B
{
};
class D1 : public B
{
};
class D2 : public B
{
};
class C: public D1, public D2
{
};
这里C在D1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,即:
class B
{
};
class D1 : virtual public B
{
};
class D2 : virtual public B
{
};
class C: public D1, public D2
{
};这样就可以回答后面的问题了,假如IX和IY按需你方式继承IUnknown,那么IX和IY的vtbl的头三个函数指向的就不是......了。
不知道说清楚了没有,我也是刚刚开始学习COM