虚拟继承和委托实施

Virtual inheritance and delegated implementation

本文关键字:继承 虚拟      更新时间:2023-10-16

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

我有一个虚拟基类IA和一个派生的虚拟基类IB。我用类a实现IA,然后从B派生IB的具体实现。据我所知,这就是经典的菱形问题。因此,我将IA的A继承设为虚拟的,而将A的B继承设为相同的。但我得到了一个警告c4250 (warning C4250: 'B' : inherits 'A::A::AnInt' via dominance)

  • 虽然这个警告表明编译器正在做我想做的事情,但我对这个警告感到不舒服,想确保#pragma out是安全的,或者有一些我不知道的问题

代码

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,那么使用该api的开发人员将无法更改有问题的抽象类。应该避免使用继承来设计接口,还是继续让派生类使用虚拟继承。

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

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

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

我也有类似的问题
我正在使用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();}