c++:为什么可以编译?(处理this-Reference到基类)

C++: Why does this compile? (Handing this-Reference to base class)

本文关键字:this-Reference 处理 基类 为什么 编译 c++      更新时间:2023-10-16

我使用多重继承,一个基类(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;
}

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

BaseBNeedsA(const BaseBNeedsA&);

被调用选中:

BaseBNeedsA(*this)

因为Derived类中的*this可以通过对BaseBNeedsA的引用来绑定