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++ 库编译和链接 C 编译器然后 SIGILL?

C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定

为啥 Visual C++ 编译器将未使用的类编译成可执行文件?

为啥 c++ 编译器不会警告返回对局部变量的引用?

C++ 编译器优化 - 为啥需要 constexpr?