《COM原理与应用》中,以IDictionary和ISpellCheck为例,继承关系如下:
Dictionary:public IDictionary, public ISpellCheck{}
书中说“如果使用虚拟继承将不能保证IDictionary和ISpellCheck与COM接口的vtable的一致性。”
对于其中的“一致性”不是很理解,以我目前对C++多继承的了解,Dictionary对象中将有两个vtalbe,分别指向IDictionary和ISpellCheck的虚函数表,两者不应该相等。是我的理解有错误么?还是一致性有其他的意思?
另外我觉得如果使用虚继承的话在返回IUnknown指针时就可以直接将this转换为IUnknown *,并且不会引起二义性,而不必像书中的将this指针转换为IDictionary指针赋值给IUnknown指针。
麻烦了解其中缘由的同学给讲解一下,谢谢。
Dictionary:public IDictionary, public ISpellCheck{}
书中说“如果使用虚拟继承将不能保证IDictionary和ISpellCheck与COM接口的vtable的一致性。”
对于其中的“一致性”不是很理解,以我目前对C++多继承的了解,Dictionary对象中将有两个vtalbe,分别指向IDictionary和ISpellCheck的虚函数表,两者不应该相等。是我的理解有错误么?还是一致性有其他的意思?
另外我觉得如果使用虚继承的话在返回IUnknown指针时就可以直接将this转换为IUnknown *,并且不会引起二义性,而不必像书中的将this指针转换为IDictionary指针赋值给IUnknown指针。
麻烦了解其中缘由的同学给讲解一下,谢谢。
在它的第一代派生类中就有可能导致实现不同
////////////////////////////////////////////////
class IUnknow
{
public:
virtual long GetNumber() = 0;
}
class CA : virtual IUnknow
{
public:
long GetNumber(){ return 15l; }; ///// CA对 GetNumber 的实现方式
}
class CE : vitual IUnknow
{
public:
long GetNUmber(){return 20l;}; ///// CE对 GetNumber 的实现方式
}class CF : public CE, public CA
{}
接下来看这里情况的矛盾CF *p = new CF;CF->GetNumber() // Huh ???? 这里就会出问题啦,不晓得调用哪个