《COM原理与应用》中,以IDictionary和ISpellCheck为例,继承关系如下:
Dictionary:public IDictionary, public ISpellCheck{}
书中说“如果使用虚拟继承将不能保证IDictionary和ISpellCheck与COM接口的vtable的一致性。”
对于其中的“一致性”不是很理解,以我目前对C++多继承的了解,Dictionary对象中将有两个vtalbe,分别指向IDictionary和ISpellCheck的虚函数表,两者不应该相等。是我的理解有错误么?还是一致性有其他的意思?
另外我觉得如果使用虚继承的话在返回IUnknown指针时就可以直接将this转换为IUnknown *,并且不会引起二义性,而不必像书中的将this指针转换为IDictionary指针赋值给IUnknown指针。
麻烦了解其中缘由的同学给讲解一下,谢谢。

解决方案 »

  1.   

    我想是由于基类的函数是纯虚函数导致的,
    在它的第一代派生类中就有可能导致实现不同
    ////////////////////////////////////////////////
    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 ????    这里就会出问题啦,不晓得调用哪个