从派生类中调用operator =

时间:2011-04-24 18:09:42

标签: c++ operator-keyword effective-c++

这是来自有效的C ++第2版斯科特迈耶斯的第16项(第70页)

作者在没有太多解释时写道,当以下列方式调用基类operator =时

Base::operator=(rhs);
如果operator = 由编译器生成(参见第45项),某些编译器(尽管不正确)会拒绝此项,以便更好地使用

static_cast<base&>(*this) = rhs;

在第45项中,他提到如果基类operator =是私有的,派生类=无权调用它。

但在原始问题中,编译器拒绝它,因为它是由编译器生成的(必须是公共的)

这方面的任何帮助(链接)都会有所帮助。 (很难谷歌这些类型的问题)

1 个答案:

答案 0 :(得分:3)

  

但在原始问题编译器是   拒绝它,因为它是生成的   通过编译器(必须是公共的)

也许我明白你想要什么。

编译器生成的赋值运算符变为公共运算符。但是第16项与访问级别无关。这个static_cast<base&>(*this)是破解编译器的解决方法。在第16项中,Scott Meyers说当编译器生成基类赋值运算符时可能需要解决方法。顺便说一句,自第2版以来发生了很大变化。第3版不再提及解决方法。

关于私人任务运营商。第45项说如果基类赋值运算符是私有的,那么编译器就不能为派生类生成赋值运算符,因为编译器生成的赋值运算符依赖于基类赋值运算符。在这种情况下,您必须手动为派生类编写赋值运算符,或者在没有赋值运算符的情况下保留派生类。