小议虚函数的原理

假设一个接口类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。

 

posted @ 2010-04-26 17:34  Dawnli  阅读(362)  评论(0编辑  收藏  举报