#include <cstdio>
class IApp1{
virtual void foo()=0;
};
class IApp2{
virtual void foo()=0;
};
class App:public IApp1, public IApp2{
void foo()
{
fprintf(stdout, "App.foo()\n");
}
};
int main()
{
App obj;
IApp1 *p1 = &obj;
IApp2 *p2 = &obj;
p1->foo();
p2->foo();
}
输出:
App.foo()
App.foo()
如此,调用p1->foo()和调用p2->foo()应该是同样的效果。
结论:
(1)C++多重继承类型中,多接口同名方法只有一个实现,不可独立实现。
(2)若类型实现多个接口,且这些接口中,存在不同接口中包含同名方法的现象。则对于这个类型来说,这些同名的方法应该是相同的语义。否则用C++的多重继承机制实现时将有无法克服的困难。
(3)最佳实践:同一类型多个接口的情况下,各接口的功能应该是正交的。对于App类型来说,IApp1代表看问题的一个角度,IApp2代表另一个角度,两个角度看问题,应该是正交的,不应该有同名的方法。
(4)同时支持某个接口的多个版本IFoo, IFooNew。比如COM组件就经常出现这样的情况。这里,如果我们认同IFoo和IFooNew的传承关系,则凡相同的方法名应对应相同的实现体。如果IFoo.foo()和IFooNew.foo()有不同的语义,则应该将IFooNew.foo()改为另一个方法名。