小议虚函数的原理

考试站(www.examzz.com)   【考试站:中国教育考试第一门户】   2013年8月14日
 假设一个接口类IX,然后一个具体类CA继承了这个接口。

  // Abstract interfaces

  interface IX

  {

  virtual void __stdcall Fx1() = 0 ;

  virtual void __stdcall Fx2() = 0 ;

  } ;

  // Interface implementation

  class CA : public IX,

  {

  public:

  // Implement interface IX.

  virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl ;}

  virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl ;}

  } ;

 int main()

  {

  CA* pA = new CA ;

  IX* pIX = pA;

  pIX->Fx1() ;

  pIX->Fx2() ;

  }

  熟悉虚函数的人必定晓得输出结果是什么。。。那C++背后在做什么呢?让我们剖析main函数里的代码。

  0. 首先需要声明的是,以虚函数定义某个类后,对象内部将构建一个虚函数表,用以保存所有定义为虚函数的函数地址,并令一个vtbl指针指向虚函数表。

  1. CA* pA = new CA ;

  pA中的vtbl指向的虚函数表将填充具体的函数地址。其虚函数表保存了两个虚函数的地址( &Fx1()和&Fx2() )

  2.  IX* pIX = pA;

  pIX指向了pA中基类的部分,也就有了访问pA vtbl的权限。

  3. pIX->Fx1() ;

  调用虚函数表中对应函数指针&Fx1,也就调用了pA中的函数Fx1。

  4. pIX->Fx2() ;

  调用虚函数表中对应函数指针&Fx2,也就调用了pA中的函数Fx2


相关文章