C++:为什么要编译? (将 this-Reference 传递给 base class)
C++: Why does this compile? (Handing this-Reference to base class)
我正在使用多重继承,一个基 class (BaseBNeedsA
) 需要访问另一个基 class (BaseA
)。我知道这可以通过委派更干净地解决,但它确实需要很多转发代码,而且我有几个类似的 classes,比如 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;
}
Class BaseBNeedsA
有一个隐式定义的复制构造函数:
BaseBNeedsA(const BaseBNeedsA&);
电话选择:
BaseBNeedsA(*this)
因为 class Derived
中的 *this
可以通过对 BaseBNeedsA
的引用进行绑定。
我正在使用多重继承,一个基 class (BaseBNeedsA
) 需要访问另一个基 class (BaseA
)。我知道这可以通过委派更干净地解决,但它确实需要很多转发代码,而且我有几个类似的 classes,比如 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;
}
Class BaseBNeedsA
有一个隐式定义的复制构造函数:
BaseBNeedsA(const BaseBNeedsA&);
电话选择:
BaseBNeedsA(*this)
因为 class Derived
中的 *this
可以通过对 BaseBNeedsA
的引用进行绑定。