CSDN博客

img xiaohyy

解决多重继承中函数同名方案

发表于2004/7/9 21:56:00  2762人阅读

当两个接口中有相同的函数声明名,比如:
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()
    }
};

这样避免了虚函数调用的开销.

0 0

相关博文

我的热门文章

img
取 消
img