在派生类接口中隐藏基类的特定函数

时间:2014-02-25 18:01:32

标签: c++ using virtual-inheritance

struct IA 
{
    virtual void Init() = 0;
    .....
};

struct A : public IA
{
    void Init() {};
    .....
};

struct B : public A
{
    int Init() { return 1; };
};

通过这样的设计我得到错误C2555:'B :: Init':覆盖虚函数返回类型...

我可以以某种方式隐藏A中的Init(),我不想隐藏其他A的功能。 A类从其他地方用作A类,不仅通过B类。

编辑:我需要在层次结构中有两个Init函数,只返回类型不同。 我不需要在B类型的对象上调用A :: Init。 实际上我可以通过

来做到这一点
struct B : private A
{
    using A::.... // all, except Init
    int Init() { return 1; };
};

但是A中有很多功能:(

1 个答案:

答案 0 :(得分:1)

由于继承,您的struct B包含功能签名void Init();int Init();和C ++不允许重载仅在返回类型上有所不同的方法。

可能不优雅的解决方案:

  • 您可以通过将void Init();中的struct A方法声明为私有并将您要继承的其他方法保留为公开来解决此错误。
  • 另一种解决方法是添加虚拟参数,例如bool,并使用Init(true)调用该方法。请注意,您无法为此虚拟参数定义默认值,否则最终会出现相同的错误。