参见英文答案 >
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; }