C++纯虚拟多重继承?

Pat*_*tou 10 c++ virtual inheritance multiple-inheritance

我需要帮助实现使用接口的多重继承...

存在具有许多功能的接口的现有代码.实例是使用工厂创建的.

class IBig
{
    // Lot of pure virtual functions
};
Run Code Online (Sandbox Code Playgroud)

他的补充:

class CBig: public IBig
{
    // Implementation
}
Run Code Online (Sandbox Code Playgroud)

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

以下是我尝试做的一个示例:

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
{
};
Run Code Online (Sandbox Code Playgroud)

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

注意:我知道设计是丑陋的,但这只是暂时的,直到可以更换大界面,并且....我想了解!;-)

提前致谢 !

Tar*_*ama 14

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

上述变化确保不会有额外的声明DoA,并DoB当您从继承创建IBaseAIBaseB多次.

  • 只是略微澄清第二句话:所有**虚拟**基础合并为一个.相同类型的非虚拟基础仍然彼此不同并且与虚拟基础不同.这样的构造通常是错误的:基础通常应该全部是虚拟的或全部是非虚拟的. (2认同)