純虛函數中vtable的作用演示

 

源代碼如下:

//

// Iface.cpp

// To compile, use: cl Iface.cpp

// date: 20090629

//author: Minrongf

#include <iostream.h>

#include <objbase.h>   // Define interface.

void trace(const char* pMsg) {cout << pMsg << endl ;}

 

// Abstract interfaces

interface IX

{

       virtual void __stdcall Fx1() = 0 ;

       virtual void __stdcall Fx2() = 0 ;

} ;

interface IY

{

       virtual void __stdcall Fy1() = 0 ;

       virtual void __stdcall Fy2() = 0 ;

} ;

// Interface implementation

class CA : public IX,

           public IY

{

public:

       // Implement interface IX.

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

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

 

       // Implement interface IY.

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

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

} ;

// Client

int main()

{

       trace("Client: Create an instance of the component.") ;

       CA* pA = new CA ;

       // Get an IX pointer.

       IX* pIX = pA ;

 

       trace("Client: Use the IX interface.") ;

       pIX->Fx1() ;

       pIX->Fx2() ;

 

       // Get an IY pointer.

       IY* pIY = pA ;

       trace("Client: Use the IY interface.") ;

       pIY->Fy1();

       pIY->Fy2();

 

       pIX = reinterpret_cast<IX*>(static_cast<IY*>(pA)) ; // notice cast

     //指針類型並不重要,vtable才決定了內部方法的功能.

       trace("Client: Use the IX interface to Call IY Function.") ;

       pIX->Fx1() ;

       pIX->Fx2() ;

 

       trace("Client: Delete the component.") ;

       delete pA ;

       return 0 ;

}

 

程序的輸出爲:

Client: Create an instance of the component.

Client: Use the IX interface.

CA::Fx1

CA::Fx2

Client: Use the IY interface.

CA::Fy1

CA::Fy2

Client: Use the IX interface to Call IY Function.

CA::Fy1

CA::Fy2

Client: Delete the component.

 

從上面的輸出結果可以看到,當把IY接口強制轉化爲IX接口後,調用IX接口的函數,實際上是執行了IY接口的實現。從上面看到指針類型並不重要,vtable才決定了內部方法的功能,如果去掉IY接口的第一個函數,那麼在把IY接口轉爲IX接口後,pIX->Fx1(),得輸出是CA::Fy2,pIX->Fx2() 將會出現異常,這是因爲IY的純虛函數不存在了.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章