C++ 基础教程:C++学习从零开始(四)

2020-01-06 12:25:01王旭

  struct E : public B, public C, public D { long e; void ABC() { e = 10; } };

  上面将有三个虚函数表,因为B、C和D都各自带了一个虚函数表(因为从A派生)。

  结果上面等同于:

  struct E

  {

  void ( E::*B_pF )(); long B_a, b;

  void ( E::*C_pF )(); long C_a, c;

  void ( E::*D_pF )(); long D_a, d; long e; void ABC() { e = 10; } E();

  void E_C_thunk_ABC() { this = ( E* )( ( ( char* )this ) - 12 ); ABC(); }

  void E_D_thunk_ABC() { this = ( E* )( ( ( char* )this ) - 24 ); ABC(); }

  };

  void ( E::*E_BVF[] )() = { E::ABC, E::BCD };

  void ( E::*E_CVF[] )() = { E::E_C_thunk_ABC, E::BCD };

  void ( E::*E_DVF[] )() = { E::E_D_thunk_ABC, E::BCD };

  E::E() { B_pF = E_BVF; C_pF = E_CVF; D_pF = E_DVF; }