当两个接口中有相同的函数声明名,比如: 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() } }; 这样避免了虚函数调用的开销.