Effective C++ 条款九、十 绝不在构造和析构过程中调用virtual函数|令operator=返回一个reference to *this
1、当在一个子类当中调用构造函数,其父类构造函数肯定先被调用。如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始化,所以无法调用子类与之对应的函数。即为指向虚函数表的指针vptr没被初始化又怎么去调用派生类的virtual函数呢?析构函数也相同,派生类先于基类被析构,又如何去找派生类相应的虚函数?
2、做法:将子类的某个函数改为non-virtual,然后在子类构造函数中传递参数给父类函数。然后父类的构造函数就可以安全的调用那个non-virtual了。
记住:
在构造和析构期间不要调用virtual函数,因为这类调用不会下降到子类这一层。
对于赋值操作符,我们常常要达到这种类似效果,即连续赋值:
int x, y, z;
x = y = z = 15; //赋值的连锁反应
x = (y = (z = 15));//执行顺序
为了实现上述的连锁赋值,赋值操作符必须返回一个 引用,来指向操作符的左侧实参。
widget & operator = (const widget& rhs) //返回类型为一个引用
{
return *this; //返回左侧对象
}
记住:
令赋值操作符返回一个reference to *this;