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

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

我们都知道,虚函数是用来支持C++中的多态的,而单独的一个类,有了虚函数,而没有任何继承关系,也就是说没有子类去覆盖父类的虚函数,这样是毫无意义的。所以下面就要从各个方面进行详细的说明虚函数表。

没有实现多态的单继承

比如有如下的继承关系:

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

在这个继承关系中,CIF2作为CIF1的子类,但是CIF2没有重写CIF1类的任何虚函数;定义CIF2 if2Obj;实例,在派生类的实例中,它的虚函数表应该是像下面这样的:

复制代码
[0]     0x011513c5 {InterfaceDemo2.exe!CIF1::IF1(void)}     void * 
[1]     0x011512cb {InterfaceDemo2.exe!CIF1::IF2(void)}     void * 
[2]     0x01151343 {InterfaceDemo2.exe!CIF1::IF3(void)}     void * 
[3]     0x01151249 {InterfaceDemo2.exe!CIF2::IF4(void)}     void * 
[4]     0x01151433 {InterfaceDemo2.exe!CIF2::IF5(void)}     void * 
[5]     0x01151267 {InterfaceDemo2.exe!CIF2::IF6(void)}     void * 
[6]     0x00000000     void *

 

可以发现,虚函数按照其声明顺序存放在表中,父类的虚函数在子类的虚函数前面。

实现多态的单继承

现在我在CIF2类中,重写CIF1类的IF1函数,它们的关系如下:

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

在上图中,CIF2继承了CIF1,并且在CIF2类中重写了CIF1的虚函数IF1,那我们现在看看虚函数表是什么样子的?

 

复制代码
[0]     0x00b61311 {InterfaceDemo2.exe!CIF2::IF1(void)}     void * 
[1]     0x00b612c6 {InterfaceDemo2.exe!CIF1::IF2(void)}     void *