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;

 

posted on 2014-08-16 10:50  zhuxuekui3  阅读(213)  评论(0编辑  收藏  举报