在网上搜索相关资料时,看到有人说,赋值操作符可以被继承,并且给出了一个例子。
一时间,也没想出那个例子错在哪里。
例子代码如下:
#include <iostream> using namespace std; class A { public: A& operator=(const A& obj) { cout << "the = operator called!" << endl; return *this; } }; class B: public A{ private: int data; public: B(int data) { this->data = data; } void printNum() { cout << this->data << endl; } }; int main() { B a(10), b(20); a = b; a.printNum(); b.printNum(); return 0; }
在上面这个例子中,派生类调用了基类的赋值操作符,但是这不能表明派生类继承了基类的赋值操作符。
当派生类没有形如 B& operator=(const B& t);这样的赋值操作符函数时,编译器会自动生成一个默认的赋值操作符函数。
同时这个函数,会去调用基类的赋值操作符函数。这也就是我们上面这个例子,让我们误以为继承了基类赋值操作函数的原因。
我们知道满足以下一个条件时,编译器并不会为类提供默认的赋值操作函数。
①类中含有常数据成员
②类中含有引用类型的成员
因此,如果将类B改写为:
class B: public A{ private: const int data = 1; public: B(int _data):data(_data) { } void printNum() { cout << this->data << endl; } };