我想做什么
我已经定义了以下公共接口 - 对于我开发
插件的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
默认实现移动到标头中,一切正常(另外我删除了虚拟继承)。我很好奇,如果可以在不将默认实现移动到标题中的情况下解决这个问题......
答案 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
如果没有实现,你就无法做到,需要定义。