C++ 在派生类中使用复制赋值
参考资料: 因为复制赋值运算符总是为任何类声明的,所以基类赋值运算符总是隐藏的。如果使用using声明从基类引入赋值运算符,并且其参数类型可能与派生类的隐式赋值运算符的参数类型相同,则using声明也会被隐式声明隐藏 根据我的理解,下面的代码不应该编译。因为C++ 在派生类中使用复制赋值,c++,c++11,copy-assignment,C++,C++11,Copy Assignment,参考资料: 因为复制赋值运算符总是为任何类声明的,所以基类赋值运算符总是隐藏的。如果使用using声明从基类引入赋值运算符,并且其参数类型可能与派生类的隐式赋值运算符的参数类型相同,则using声明也会被隐式声明隐藏 根据我的理解,下面的代码不应该编译。因为 运算符=(常量B&)被隐式声明 运算符=(常量A&)和using声明都是隐藏的 #包括 使用名称空间std; A类{ 公众: A&A运算符=(常量A&A){ 无法隐藏B的复制赋值运算符,因为您提到的两个运算符采用不同的参数。来自#12.8[
#包括
使用名称空间std;
A类{
公众:
A&A运算符=(常量A&A){
无法隐藏B的复制赋值运算符,因为您提到的两个运算符采用不同的参数。来自#12.8[强调添加]:
24由于复制/移动赋值运算符在未由用户声明的情况下隐式声明给类,因此基类复制/移动赋值运算符总是被派生类的相应赋值运算符隐藏(13.5.3)。a using声明(7.3.3)从基类引入参数类型可能为派生类的复制/移动赋值运算符的赋值运算符的,不视为此类运算符的显式声明,也不抑制派生类运算符的隐式声明;由using声明引入的运算符为hi由派生类中隐式声明的运算符删除。
类B
赋值操作的隐式声明如下:
B& B::operator=(const B&)
类B
中使用声明赋值运算符的参数类型不同于隐式声明赋值运算符。因此,它抑制派生类B
运算符的隐式声明
要了解您发布的代码的1和2 w.r.t.:
否,赋值运算符的隐式声明在类B
中被禁止
不,它们不会被隐藏
我认为您提到的参考资料应分为两部分,以满足您的2个问题:
是的,默认情况下,基类(A)和派生类(B)的副本分配是隐式声明的。您只需通过向流输出消息来覆盖类A上的隐式声明
引用的第二部分意味着,如果将类B的实例分配给类A的实例,并且存在使用声明来使用类A分配,则将使用类A的分配。这意味着,如果将类B的实例分配给类B的其他实例,则将使用默认的隐式分配。T因此,由于参数类型的不同,没有隐藏任何内容,代码将调用using声明(也称为基类赋值)=>将消息输出到流
我看不出这段代码与标准有任何冲突。
b1=a1;
完成此赋值是因为使用了基类声明。
以及“派生类的隐式赋值运算符”是由编译器提供的,因为如果您想分配派生类的两个对象,这是可能的。第二个原因,您说这两个运算符都是隐藏的,但都是公共的。隐藏是什么意思?使用声明的说明B::operator=
与A::operator=
@bitmask相同,我不认为这确实是一种想法。如果类B
中添加了一个数据变量,那么编译器将在需要时为类B
创建一个赋值运算符,该类将使用a::operator=()类A
用于作业的类A
部分。使用允许类A
的必要部分,运算符=()
在这种情况下,要公开并可用于类B
对象,因为除此之外A
是私有的,因此不会公开给B
,因为public
继承未指定或未被使用。@Henri是的,这就是我要问的。标准说它们是隐藏的,从我的理解来看,是标准的我由于隐式声明了B::operator=(),使用语句和A::operator=()都无效的ans“隐藏”它们。也许我的理解是错误的,但我仍然想知道“隐藏”在这里的含义是什么?不返回并不是构建停止错误。这会带来很多有趣的调试。@user4581301 msvc会导致编译错误一个编译器不是标准的,但我承认当有人抛出bit/stdc++.hExperime时,我也会做同样的特技MSVC 2017的nts表明,如果我向类B
添加一个变量,并使用两个类B
变量b1
和b2
,当我执行赋值时,b2=b1;
将创建类B
的隐式赋值,使用类a
版本的运算符=
。classB
变量值更改,我看到显示调用了A::operator=
的打印。我也在调试器中看到它。当b1=a1;
使用修改的类B
时,我看到执行了A::operator=
。如果我随后添加B::operator=(A&A)
然后b1=a1:
使用了它,而b2=b1;
使用了A:operator=
。感谢您的解释。您能提供一个例子,说明using语句和A::operator=()被隐式声明的B::operator=()隐藏吗?我将A::operator=()
更改为void A::operator>=(const B&B){cout@HeyiSun但这没有编译:您得到的错误是什么?@RichardChambers如果您在类B
中使用了操作符=;
,则赋值操作符的隐式声明将
B& B::operator=(const B&)