最近我研究了“Inside COM”这本书,我找到了一个代码示例如下: 接口定义为struct。 IX和IY继承IUnknown。 CA类继承IX和IY。 据我所知,在这种情况下,CA应该有虚拟功能的两个虚拟点,一个属于IX,另一个属于IY?
Interface IUnknown
{
virtual void QueryInterface() = 0;
virtual void AddRef() = 0
virtual void Release() = 0;
};
Interface IX : IUnknown
{
void X()
{
printf("X()\n");
}
};
Interface IY : IUnknown
{
void Y()
{
printf("Y()\n");
}
};
class CA : public IX, public IY
{
public:
void QueryInterface()
{
printf("QueryInterface()\n");
}
void AddRef()
{
printf("AddRef()\n");
}
void Release()
{
printf("Release()\n");
}
};
我的问题是为什么CA只实现QueryInterface(),AddRef(),Release()并且代码可以工作。 为什么不存在QueryInterface(),AddRef(),Release()的实现属于IX或属于IY的模糊问题。
感谢。
答案 0 :(得分:1)
在派生类中声明的函数将覆盖在任何基类中声明的任何匹配的虚函数。因此,例如,CA::QueryInterface()
将覆盖通过两个基类子对象都可访问的IUnknown::QueryInterface()
。
如果IX
和IY
都覆盖它,而CA
没有覆盖它,你就会产生歧义,并且你试图通过对{{1}的引用来调用它}。在这种情况下,有两个潜在的重载,没有理由更喜欢。详细说明:
CA