继承作为面向对象的基本特征之一,其使用率极高。不管是为了实现软件的基本功能,还是再程序的重构的过程中,我们总是会用到继承机制。正是因为其用途极为广泛,而且使用简单,大众程序员对其真正的内部实现机制的探究不是很深。而且,在大部分情况下,我们对继承的使用方法是错误的。下面用例子来说明问题。
- class Animal {
- public:
- Animal &operator=(const Animal &rhs);
- ...
- };
- class Animal1: public Animal {
- public:
- Animal1 &operator=(const Animal1 &rhs);
- ...
- };
- class Animal2: public Animal {
- public:
- Animal2 &operator=(const Animal2 &rhs);
- ...
- };
- Animal1 an1;
- Animal2 an2;
- Animal *pAn1 = &an1;
- Animal *pAn2 = &an2;
- ...
- *pAn1 = *pAn2;
不过,大部分人都不是实现移花接木的功能,那么怎么实现全部成分的赋值效果呢?
既然已经用到了继承机制,那么就不得离开虚函数了。我们将赋值操作符函数定义为虚函数,代码如下:
- class Animal {
- public:
- virtual Animal &operator=(const Animal &rhs);
- ...
- };
- class Animal1: public Animal {
- public:
- virtual Animal1 &operator=(const Animal1 &rhs);
- ...};class Animal2: public Animal { public: virtual Animal2 &operator=(const Animal2 &rhs);
- ...};
- Animal1 an1;
- Animal2 an2;//这里是Animal2对象,与前面的Animal1不同
- Animal *pAn1 = &an1;
- Animal *pAn2 = &an2;
- ...
- *pAn1 = *pAn2;//将Animal2对象赋值给Animal1