在「C/C++雜記:虛函數的實現的基本原理」一文中曾提到「虛函數表」的概念,只是爲了便於理解,事實是:虛函數表並不真的獨立存在,它只是虛表(virtual table)中的一部份內容。例:
html
從圖中可已看出,虛表除了包含虛函數指針,還包含其它一些信息(如:RTTI信息、偏移值等)。git
順便介紹一下gcc的-fdump-class-hierarchy選項,它能夠用於輸出C++程序的虛表結構(在當前目錄下生成一個.class文件),例:
github
一個虛表包含如下幾個部分:
函數
其中:指針
前一節的示例是單繼承的示例,下面列出了一個多繼承的示例:
orm
從中能夠看到:D的虛表中包含兩個虛表結構,第一個也稱之爲「主虛表」(primary virtual table),另外一個虛表又稱之爲「次虛表」(secondary virtual table)。htm
簡單地歸納一下:一個含有虛函數(不管是其自己的,仍是繼承而來的)的類,能夠有一個主虛表和多個次虛表,主虛表和次虛表構成一個虛表組(virtual table group)。對象
Itanium C++ ABIblog