源代碼如下:
//
// 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的純虛函數不存在了.