C ++:为什么要编译? (把这个 - 参考基类)

时间:2015-09-25 14:55:52

标签: c++ visual-studio compiler-errors multiple-inheritance

我使用多重继承,一个基类(BaseBNeedsA)需要访问另一个基类(BaseA)。我知道这可以通过委托解决更清晰,但它确实会有很多转发代码,我有几个类似的类BaseBNeedsA

在Visual Studio 2013中,我可以使用BaseA &进行访问,在Visual Studio 2015中,这似乎会导致对象切片等。 (编译,但引用无效)。所以我将其更改为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;
}

1 个答案:

答案 0 :(得分:1)

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

BaseBNeedsA(const BaseBNeedsA&);

由电话挑选:

BaseBNeedsA(*this)

因为类*this中的Derived可以通过对BaseBNeedsA的引用进行约束。