C纯虚拟多重继承?

我需要一个使用多个继承接口的实现的帮助…

有一个现有的代码,一个界面有很多功能.这些实例是使用工厂创建的.

class IBig
{
    // Lot of pure virtual functions
};

他的实现:

class CBig: public IBig
{
    // Implementation
}

我想将接口拆分成多个较小的接口,但是它应该保持与现有代码的兼容性一段时间.

这是我试图做的一个例子:

class IBaseA
{
public:
    virtual void DoA() = 0;
};

class IBaseB
{
public:
    virtual void DoB() = 0;
};

// The same interface, now based on multiple smaller interfaces
class IBig : public IBaseA, public IBaseB
{
};

class CBaseA: public IBaseA
{
public:
    virtual void DoA()
    {
        printf("DoA\n");
    }
};

class CBaseB: public IBaseB
{
public:
    virtual void DoB()
    {
        printf("DoB\n");
    }
};

// Inherit from base classes where the implementation is, and from IBig as 
// the instance of CBig is returned as IBig.
class CBig: public CBaseA, public CBaseB, public IBig
{
};

这里的问题是CBig类无法体现.编译器说,DoA和DoB的功能是纯虚拟的,即使它们在CBaseA和CBaseB中实现.如果我不想再次实现这些功能,只需调用基类的功能,该怎么办?

注意:我知道设计是丑陋的,但这只是暂时的,直到大的界面可以被替换,而且….我想明白! 😉

提前致谢 !

最佳答案
这里你应该使用虚拟继承.此功能确保在实例化子类时只有一个虚拟继承的基类的实例.对于你的例子,这样看起来像:

#include <cstdio>

class IBaseA
{
public:
    virtual void DoA() = 0;
};

class IBaseB
{
public:
    virtual void DoB() = 0;
};

// The same interface, now based on multiple smaller interfaces
class IBig : virtual public IBaseA,  virtual public IBaseB
//              ^                       ^
{
};

class CBaseA: virtual public IBaseA
//              ^
{
public:
    virtual void DoA()
    {
        printf("DoA\n");
    }
};

class CBaseB: virtual public IBaseB
//              ^
{
public:
    virtual void DoB()
    {
        printf("DoB\n");
    }
};

// Inherit from base classes where the implementation is, and from IBig as 
// the instance of CBig is returned as IBig.
class CBig: public CBaseA, public CBaseB, public IBig
{
};

int main()
{
    CBig cb;
}

上述更改确保在多次从IBaseA和IBaseB继承时,不会创建DoA和DoB的额外声明.

转载注明原文:C纯虚拟多重继承? - 代码日志