当两个接口中有相同的函数声明名,比如:
interface IA
{
virtual void Fun()=0;
};
interface IB
{
virtual void Fun()=0;
};
类CD继承这两个接口:
class CD : public IA,public IB
{
public:
void Fun();
};
如果要实现这样的效果:针对IA和IB的接口函数Fun有不同的实现,就涉及到多重继承函数同名的问题.
经典的解决方案是ARM中提出的引入中间类:
class IAImpl : public IA
{
public:
virtual void Fun()
{
InternalFunA();
}
virtual void InternalFunA() = 0;
};
class IBImpl : public IB
{
public:
virtual void Fun()
{
InternalFunB();
}
virtual void InternalFunB() = 0;
};
现在的class CD应该是这个样子
class CD:public IAImpl,public IBImpl
{
public:
void InternalFunA()
{
// 这里实现IA::Fun()
}
void InternalFunB()
{
// 这里实现IB::Fun()
}
};
这样,就成功解决了多重继承的同名函数问题,这里IAImpl和IBImpl中的Fun函数使用了最简单的Template Method模式.
当然,这里使用了虚函数,可以用模板来替换,更为高效的一个解决方案如下:
template<typename T>
class IAImpl : public IA
{
public:
virtual void Fun()
{
T* pT = static_cast<T*>(this);
pT->InternalFunA();
}
};
template<typename T>
class IBImpl : public IB
{
public:
virtual void Fun()
{
T* pT = static_cast<T*>(this);
pT->InternalFunB();
}
};
class CD:public IAImpl<CD>,public IBImpl<CD>
{
public:
void InternalFunA()
{
// 这里实现IA::Fun()
}
void InternalFunB()
{
// 这里实现IB::Fun()
}
};
这样避免了虚函数调用的开销.