【问题标题】:Virtual inheritance and delegated implementation虚拟继承和委托实现
【发布时间】:2012-03-18 22:13:57
【问题描述】:

我正在开发一个供内部和外部使用的 api。在 Visual Studio 10 上。

我有一个虚拟基类 IA 和一个派生的虚拟基类 IB。我用 A 类实现 IA,然后从 B 派生出 IB 的具体实现。据我了解,这是经典的钻石问题。因此,我将 IA 的 A 继承设置为虚拟的,并将 A 的 Bs 继承设为相同。但我收到警告 c4250 (warning C4250: 'B' : inherits 'A::A::AnInt' via dominance)

  • 虽然此警告接缝表明编译器正在执行我想要的操作,但我对警告感到不舒服,并希望确保 #pragma 退出是安全的,或者存在一些我不知道的问题。

代码

class IA
{
public:
    virtual int AnInt() = 0; 
};

class A : virtual public IA 
{
public:
    virtual int AnInt()
    {
        return 3; 
    }
};

class IB : virtual  public IA
{
public:
    virtual int AnInt2() = 0; 
};

class B : public A, public IB
{
public:
    int AnInt2()
    {
        return 4; 
    }   
};

问题的第二部分。如果您正在创建一个 api,消费开发人员将无法更改相关抽象类。您应该避免设计带有继承的接口,还是继续让派生类使用虚拟继承。

【问题讨论】:

    标签: c++ visual-studio warnings virtual-inheritance


    【解决方案1】:

    这个问题已经讨论过previously。 Dani van der Meer 的回答专门解决了这个问题。自 2005 年以来,它在 Visual Studio 中被归档为不会修复 bug report

    如果您不喜欢禁用警告,您可以随时明确选择功能。

    class B : public IB, public A
    {
    public:
    +    int AnInt()
    +    {
    +        return A::AnInt();
    +    }
    
        int AnInt2()
        {
            return 4; 
        }   
    };
    

    【讨论】:

      【解决方案2】:

      我也有类似的问题。
      我正在使用 MSVC2010

      我最终创建了一个单独的文件来指定委托(因为这对于所有派生都是通用的)来克服警告 任何关于它的 cmets 是坏的还是不好的都表示赞赏

      class iCommon //pure virtual
      {
       virtual void Foo()=0;
      }
      
      class iDerived: virtual iCommon //pure virtual... intended to allow testing with mocks
      {
       virtual void Bar()=0;
      }
      
      class CommonImpl : virtual public iCommon
      {
       virtual void Foo(){/* do common stuff*/}
      }
      
      class Derived: virtual public CommonImpl,virtual public iDerived
      {
        //implement the derived functionality
        virtual void Bar(){/* this method is not common*/}
       //now load the file to avoid compiler warnings
        #include "CommonImpl.delegate"
      }
      

      “CommonImpl.delegate”的内容

      virtual void Foo() overload {return CommonImpl::Foo();}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多