我正在使用多重继承,并且一个基类(BaseBNeedsA)需要访问另一基类(BaseA)。我知道可以通过委派来解决此问题,但这确实是很多转发代码,并且我有几个类似的类,例如BaseBNeedsA

在Visual Studio 2013中,我可以使用BaseA &进行访问,在Visual Studio 2015中,这似乎导致对象 slice 或其他原因。 (编译,但是引用无效)。所以我将其更改为BaseA * const,一切正常。但是,在这样做时,我发现了一些奇怪的东西。下面的代码在Visual Studio 2015中编译,我不知道为什么会这样。

class BaseA
{ };


class BaseBNeedsA
{

public:

  BaseBNeedsA(BaseA *baseA)
  : _baseA(baseA)
  { }


private:

  BaseA * const _baseA;

};


class Derived : public BaseA, public BaseBNeedsA
{

public:

  Derived()
  : BaseA(),
    BaseBNeedsA(*this) // Why does this compile? Handing a BaseA&, but BaseA* required!
  { }

};


int main(int argc, char** argv)
{
  Derived d;
  return 0;
}

最佳答案

BaseBNeedsA类具有一个隐式定义的复制构造函数:

BaseBNeedsA(const BaseBNeedsA&);

由电话选择:
BaseBNeedsA(*this)

因为类*this中的Derived可以由对BaseBNeedsA的引用绑定(bind)。

08-03 15:00