构造函数,赋值操作符不应该是虚函数
在有继承层次类的时候,我们已经知道析构函数应该是虚函数,但很多人对构造函数和赋值操作符应不应该是虚函数并不清楚。
首先,构造函数不能是虚函数,因为构造函数是在对象完全构造之前运行的,在构造函数运行的时候,对象的动态类型还不完整。
对于赋值操作符,虽然可以在基类中将成员函数operator=定义成虚函数,但这样做并不会影响派生类中赋值操作符的使用。因为每个类有自己的赋值操作符。每个类的赋值操作符都有一个和类本身类型相同的形参,该类型必须不同于继承层次中任意其他类的赋值操作符的形参类型。因此子类的赋值操作符和基类的赋值操作符并不是同一个。但是,在这个子类中仍然有基类的那个操作符,但不是赋值操作符。
将赋值操作符设为虚函数容易让人混淆,因为虚函数必须在基类和派生类中具有相同的形参,基类赋值操作符有一个形参是自身类类型的引用,如果该操作符为虚函数,则每个类都将得到一个虚函数成员,该成员定义了参数为一个基类对象的operator=。但是,对于派生类而言,这个操作符与赋值操作符是不同的。
因此,将赋值操作符设为虚函数很容易令人混淆,并且没有什么用处。