默认实现不起作用的多重继承 - 强制始终覆盖默认实现

时间:2018-04-27 07:19:49

标签: c++ inheritance multiple-inheritance

我想做什么

  • 我希望有一个基本接口和大量子接口扩展此基本接口
  • 我想要默认接口​​的默认实现
  • 我希望我的所有子接口实现都扩展默认实现,并且只覆盖他们想要的那些方法

我已经定义了以下公共接口 - 对于我开发

插件的SDK,需要这样做
// the base interface
class DYNAMIC_ATTRIBUTE IMasterProfile : public IVWUnknown
{
    public:

        virtual Uint16      VCOM_CALLTYPE GetNodeVersion() = 0;
        // ...

}

// one of many sub interfaces extending the default one
class DYNAMIC_ATTRIBUTE ISomeProfile : public IMasterProfile
{
    public:

        virtual void        VCOM_CALLTYPE SwapData() = 0;
};

我的实施如下:

class DYNAMIC_ATTRIBUTE MasterProfile : public virtual IMasterProfile
{
    public:
        Uint16 VCOM_CALLTYPE GetNodeVersion() override { return 0; };
        // ...
}

class DYNAMIC_ATTRIBUTE SomeProfile : public MasterProfile, public virtual ISomeProfile
{
    public:
        void VCOM_CALLTYPE SwapData() override { }
}

问题:

编译器抱怨SomeProfile是抽象的,并没有实现GetNodeVersion函数。我怎么解决这个问题? SomeProfile正在扩展MasterProfile,此类正在实施GetNodeVersion函数...

编辑:可能的解决方案

我可以将IMasterProfile默认实现移动到标头中,一切正常(另外我删除了虚拟继承)。我很好奇,如果可以在不将默认实现移动到标题中的情况下解决这个问题......

1 个答案:

答案 0 :(得分:0)

问题在于含糊不清。您必须在Waiting...中实施GetNodeVersion。否则ISomeProfile未定义,它是抽象的。 请考虑以下代码:

SomeProfile::ISomeProfile::GetNodeVersion

所以当你想在class IMasterProfile { public: virtual int GetNodeVersion() = 0; }; class ISomeProfile : public IMasterProfile { public: virtual void SwapData() = 0; int GetNodeVersion() override { return 2; }; }; class MasterProfile : virtual IMasterProfile { public: int GetNodeVersion() override { return 3; }; // ... }; class SomeProfile : public MasterProfile, public virtual ISomeProfile { public: SomeProfile(){ std::cout<<ISomeProfile::GetNodeVersion();} void print() { std::cout<<GetNodeVersion(); // ERROR: Call to the "GetNodeVersion" is ambiguous std::cout<<MasterProfile::GetNodeVersion(); // Call to the GetNodeVersion from MasterProfile std::cout<<ISomeProfile::GetNodeVersion(); // Call to the GetNodeVersion from ISomeProfile, without implementing it's virtual method } void SwapData() override { } }; 中使用时,问题就出现了问题:

SomeProfile

如果没有实现,你就无法做到,需要定义。