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