条款09:绝不在构造和析构过程中调用virtual函数

  1. 我们使用虚函数的目的是为了动态联编,但是在构造函数和析构函数中使用虚函数是无法达到此目的的。因为无论是在构造函数还是析构函数中调用虚函数,那么都是会进行实调用而非需调用,可以将此构造和析构的过程理解成一个栈,无论是在进行构造还是析构的过程中当需要运行基类的构造或者析构函数中的虚函数的时候,都是在栈底,而派生类的成员都是没有的(不是没有初始化就是已经被析构)。
  2. 大多数编译器会在违反此条例的时候报错,但是假如我们在构造函数或析构函数中调用了普通函数a,而a又调用了虚函数b,编译器就会无动于衷,而这种情况会间接违反此条例,造成的危害是等价的。
  3. 构造函数负责构造‘虚指针’来进行虚函数的调用。
  4. 假如真的需要在构造函数期间得知派生类的信息,那么可以使用从派生类传递参数到基类的方式来进行。

你可能感兴趣的:(条款09:绝不在构造和析构过程中调用virtual函数)