COM接口是通過C++的Vtable建立起來的,Vtable是虛函數表(Virtual Function Table)的縮寫。在C++中的虛函數表提供了類實例功能的滯後綁定(Late Binding,也稱爲後綁定)。
一個COM接口實際就是一個指向Vtable結構的指針。
當你把一個函數聲明爲虛函數時,編譯器將在你的類結構里加上一個指針,該指針被稱爲虛指針,寫爲:vptr。vptr指向一個Vtable結構,該結構包含了類中所有虛函數的地址,也包含基類。
Class Fruit
{
Public:
Void put_color( string str )
{
m_strColor = str;
}
String get_Color()
{
return m_strColor;
}
Virtual void Draw(){};
Private:
String m_strColor;
}
Class Apple : public Fruit
{
Public:
Void Draw()
{
Cout << "I'm an apple" << endl;
}
}
Class GrannySmith: public Apple
{
Public:
Void Draw()
{
Cout << "I'm a Granny Smith Apple" << endl;
}
}
基類裏虛函數的使用是COM設計的核心。抽象類定義提供了一個僅僅包含有類的公共方法(接口)的Vtable。IMath類裏不包含數據成員,並且沒有實現函數。它的唯一目的是強制派生類(Math)以虛函數的方式實現組件接口的方法。
一個COM接口只不過是一個指向一個具有C++風格的接口(或Vtable)的指針的指針(雙重指針)。