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

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

[3]     0x00000000     void *

 

从上面的虚函数表,我们可以分析出来,每个父类都有自己的虚函数表,子类的虚函数被放到了第一个父类的表中。第一个父类是按照声明顺序来判断的。

实现多态的多继承

上面说的是没有发生重写的情况,现在来说说发生重写的情况;比如,现在有以下情况:

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

在子类中重写了父类的虚函数,那它的虚函数表又是什么样子呢?

虚函数表CIF1,如下:

 

复制代码
[0]     0x012013cf {InterfaceDemo2.exe!CIF3::IF1(void)}     void * 
[1]     0x012012d5 {InterfaceDemo2.exe!CIF1::IF2(void)}     void * 
[2]     0x0120134d {InterfaceDemo2.exe!CIF1::IF3(void)}     void * 
[3]     0x01201456 {InterfaceDemo2.exe!CIF3::IF4(void)}     void * 
[4]     0x012014d8 {InterfaceDemo2.exe!CIF3::IF5(void)}     void * 
[5]     0x00000000     void *

 

虚函数表CIF2,如下:

 

复制代码
[0]     0x012014e2 {InterfaceDemo2.exe![thunk]:CIF3::IF1`adjustor{4}' (void)}     void * 
[1]     0x012014ce {InterfaceDemo2.exe!CIF2::IF2(void)}     void * 
[2]     0x012014d3 {InterfaceDemo2.exe!CIF2::IF3(void)}     void * 
[3]     0x00000000     void *

 

从上面的虚函数表中,我们可以看到虚函数表中的CIF1::IF1(void)全都被替换成了CIF3::IF1(void),那么我们就可以以任意的父类指针来调用IF1(void),实际上调用的是CIF3::IF1(void),这就实现了所谓的多态。

总结

总结了这么多关于虚函数表的内容,感觉很扯,和接口没有多大的关系;但是,这一切都是COM的基础,COM的背后,就是接口,而接口的背后,就是我这里总结的,说白了,完全了解了这里,对于理解COM的接口是有非常大的用处的。希望我的总结对大家有用。