C++ 在派生类中使用复制赋值

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[

参考资料:

因为复制赋值运算符总是为任何类声明的,所以基类赋值运算符总是隐藏的。如果使用using声明从基类引入赋值运算符,并且其参数类型可能与派生类的隐式赋值运算符的参数类型相同,则using声明也会被隐式声明隐藏

根据我的理解,下面的代码不应该编译。因为

  • 运算符=(常量B&)被隐式声明
  • 运算符=(常量A&)和using声明都是隐藏的
  • #包括
    使用名称空间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
    版本的
    运算符=
    。class
    B
    变量值更改,我看到显示调用了
    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&)