派生类中的C赋值运算符

参见英文答案 > operator= and functions that are not inherited in C++?3个
我不太明白为什么对于赋值,派生类不会调用基类的相应运算符,如果它自己不存在的话.看看代码
#include <iostream>
using namespace std;

class A{
protected:
  void myWrite(){
    cout << " Base " <<endl;
  }
public:
  double x,y;
  A(): x{0},y{0}{};
  virtual A & operator=(double g){x=g;y=g;return *this;}
  virtual ~A(){};
  virtual void doneit(){myWrite();}
};


class B: public A{
protected:
public:
  B():A(){};
  virtual ~B(){};
  virtual void doneit(){myWrite();}
};

int main() {
  A jj;
  B pp;

  pp=0.0;
  return 0;
}

因为它是代码不编译.当然,如果我为B定义一个“运算符=”与A的相同,那么一切正常,但是为什么认情况下不调用B“operator =”如果未定义派生类中的那个?你能帮忙解释一下这个问题吗?

gcc编译器说../src/tito.cpp:40:4:错误:没有可行的重载’=’
PP = 0.0;
~~ ^ ~~~
../src/tito.cpp:28:7:注意:候选函数(隐式复制赋值运算符)不可行:第一个参数没有从’double’到’const B’的已知转换
B级:公共A {
^
生成1个错误.

你能解释一下为什么它不起作用吗?

解决方法

如果您没有声明复制赋值运算符,编译器将为您声明一个.所以你的B级看起来很像:
class B : public A {
public:
    // explicit
    B();
    virtual ~B();
    virtual void doneit();

    // implicit
    B(const B&);
    B& operator=(const B&);
};

隐式复制赋值运算符隐藏了您编写的A :: operator =(double),因此它是名称查找将找到的唯一候选者.当然,它不是一个可行的候选者,因为double不能转换为B,因此错误.

要使用A :: operator =(double)运算符,必​​须将其明确地引入范围:

using A::operator=;

但是那时你不会分配任何B部分.所以最好更明确一点:

B& operator=(double g) {
    // B stuff here

    // A stuff
    A::operator=(g);

    return *this;
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...