C++ COM编程之接口背后的虚函数表

2020-01-06 12:54:53王旭

[2]     0x00b61343 {InterfaceDemo2.exe!CIF1::IF3(void)}     void * 
[3]     0x00b61249 {InterfaceDemo2.exe!CIF2::IF4(void)}     void * 
[4]     0x00b61433 {InterfaceDemo2.exe!CIF2::IF5(void)}     void *
[5]     0x00000000     void *

 

你发现了什么?虚函数表中的第一项是CIF2::IF1,而不是CIF1::IF1,这说明了当在子类中重写父类的虚函数时,新的函数的地址覆盖了父类的虚函数地址,这样就能在多态时能正确的找到需要被调用的函数;而没有被覆盖的函数还是那样的顺序在虚函数表中存储着。

没有实现多态的多继承

对于简单的,没有实现多态的多继承,比如,有下面的一个多继承关系:

C++ COM编程之接口背后的虚函数表

在子类中没有重写任何父类的虚函数,那么它的虚函数表应该是什么样子呢?

虚函数表CIF1,如下:

复制代码
[0]     0x001e13d9 {InterfaceDemo2.exe!CIF1::IF1(void)}     void * 
[1]     0x001e12df {InterfaceDemo2.exe!CIF1::IF2(void)}     void * 
[2]     0x001e1357 {InterfaceDemo2.exe!CIF1::IF3(void)}     void * 
[3]     0x001e10c8 {InterfaceDemo2.exe!CIF3::IF4(void)}     void * 
[4]     0x001e1041 {InterfaceDemo2.exe!CIF3::IF5(void)}     void * 
[5]     0x001e1249 {InterfaceDemo2.exe!CIF3::IF6(void)}     void * 
[6]     0x00000000     void *

 

虚函数表CIF2,如下:

 

复制代码
[0]     0x001e1258 {InterfaceDemo2.exe!CIF2::IF7(void)}     void * 
[1]     0x001e1447 {InterfaceDemo2.exe!CIF2::IF8(void)}     void * 
[2]     0x001e127b {InterfaceDemo2.exe!CIF2::IF9(void)}     void *