C++:为啥会编译? (将 this-Reference 交给基类)
Posted
技术标签:
【中文标题】C++:为啥会编译? (将 this-Reference 交给基类)【英文标题】:C++: Why does this compile? (Handing this-Reference to base class)C++:为什么会编译? (将 this-Reference 交给基类) 【发布时间】:2015-09-25 14:55:51 【问题描述】:我正在使用多重继承,一个基类 (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
的拷贝构造函数
@PiotrSkotnicki 这不是评论!
我怎么会错过这个。让它成为一个答案,所以我可以接受它。
【参考方案1】:
BaseBNeedsA
类有一个隐式定义的复制构造函数:
BaseBNeedsA(const BaseBNeedsA&);
由调用选择:
BaseBNeedsA(*this)
因为Derived
类中的*this
可以通过对BaseBNeedsA
的引用进行绑定。
【讨论】:
谢谢,完全错过了。我将在所有基础中添加 C++11 已删除的默认实现,以便为这个讨厌的错误获取编译器错误。以上是关于C++:为啥会编译? (将 this-Reference 交给基类)的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C 程序会在运行时针对 C++ 库编译和链接 C 编译器然后 SIGILL?
C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定