【问题标题】:Virtual multiple interface虚拟多接口
【发布时间】:2015-07-01 11:19:38
【问题描述】:

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

有一个现有的代码,其接口具有很多功能。实例是使用工厂创建的。

class IBig
{
    // Lot of pure virtual functions
};
And his inplementation:

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 中实现。不想再实现函数,只调用基类的函数怎么办?

NB:我知道设计很丑,但这只是暂时的,直到可以更换大接口,并且....我想了解! ;-)

提前致谢!

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    #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 声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2015-08-27
      • 2012-10-11
      相关资源
      最近更新 更多