2

我正在开发一个供内部和外部使用的 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,消费开发人员将无法更改相关抽象类。您应该避免设计带有继承的接口,还是继续让派生类使用虚拟继承。

4

2 回答 2

1

这个问题之前已经讨论。Dani van der Meer 的回答专门解决了这个问题。自 2005 年以来,它已在 Visual Studio 中作为不会修复的错误报告提交。

如果你不喜欢禁用警告,你总是可以明确地选择功能。

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

    int AnInt2()
    {
        return 4; 
    }   
};
于 2012-03-18T22:41:09.073 回答
0

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

我最终创建了一个单独的文件来指定委派(因为这对于所有派生来说都是通用的)来克服警告对它的任何评论都是不好的或不是的

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();}
于 2015-01-03T14:43:33.717 回答