0

在 c++ 中,我在 bruce eckel 中读到不会自动继承的函数是:

  1. 构造函数
  2. 析构函数
  3. 运算符 = ( 因为它像构造函数那样做)

但是这段代码说的是别的

#include<iostream>             
using namespace std;`                   

class A {
 public:
   A & operator= (A &a) {
    cout<<" base class assignment operator called ";
    return *this;
   }
};

class B: public A { };

int main()
{
  B a, b;
  a.A::operator=(b); //calling base class assignment operator function
                // using derived class
  a = b; // this also works
  //getchar();
  return 0;

}   

输出:调用的基类赋值运算符

请解释。

4

3 回答 3

0

根据http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter14_010.html,当您没有=为您的类定义构造函数、析构函数或运算符时,它会自动创建所有三个的简单版本。

“代替继承,如果您不自己创建这些函数,则编译器会合成它们。(使用构造函数,您不能创建任何构造函数以便编译器合成默认构造函数和复制构造函数。)综合构造函数使用成员初始化,综合运算符 = 使用成员赋值。”

因此,B 有一个=由编译器自动生成的综合运算符。

于 2013-06-06T09:05:29.497 回答
0

事实上,说不operator =继承是不正确的。问题是它被派生类的隐式生成隐藏operator =了,因此(例如)下面代码中的赋值是非法的:

A a;
B b;
b = a;

由于类B没有任何operator =接受的A,而只有一个隐式生成的具有以下签名的复制赋值运算符:

B& operator = (B const&)

这种情况与派生类中的常规成员函数在基类中隐藏同名成员函数的情况没有什么不同。

至于常规的成员函数,你可以using在你的类中有一个声明,使基类operator =可用:

class B: public A
{
public:
    using A::operator =;
//  ^^^^^^^^^^^^^^^^^^^^
};

这将使前面示例中的分配编译。

于 2013-06-06T09:04:25.303 回答
0

没有 operator=() 的继承A。相反,基赋值运算符是从派生类赋值运算符中调用的,因为隐式赋值运算符“简单地”分配所有成员和基类。

(有关何时隐式生成默认复制或移动分配以及以何种形式生成的信息,请参见标准 [Draft N3242] §12.8。)

标准(草案 N3242)说:

§12.8 / 29

非联合类 X 的隐式定义的复制/移动赋值运算符执行其子对象的成员复制/移动赋值。首先分配 X 的直接基类,按照它们在基说明符列表中的声明顺序,然后按照它们在类定义中声明的顺序分配 X 的直接非静态数据成员.

在那里,我们得到了赋值运算符。

XBdirect base classA。因此,在 的隐式赋值运算符中B,它的类型子对象A将使用A::operator=(...).

注意:通过 const 引用(如果使用复制和交换,则通过值)提供赋值运算符参数是有利的。

于 2013-06-06T09:26:38.520 回答