C++ COM编程之接口背后的虚函数表(3)
[0] 0x001e1258 {InterfaceDemo2.exe!CIF2::IF7(void)} void *
[1] 0x001e1447 {InterfaceDemo2.exe!CIF2::IF8(void)} void *
[2] 0x001e127b {InterfaceDemo2.exe!CIF2::IF9(void)} void *
[3] 0x00000000 void *
从上面的虚函数表,我们可以分析出来,每个父类都有自己的虚函数表,子类的虚函数被放到了第一个父类的表中。第一个父类是按照声明顺序来判断的。
实现多态的多继承
上面说的是没有发生重写的情况,现在来说说发生重写的情况;比如,现在有以下情况:
在子类中重写了父类的虚函数,那它的虚函数表又是什么样子呢?
虚函数表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的接口是有非常大的用处的。希望我的总结对大家有用。
- 上一篇:C++设计模式之装饰模式
- 下一篇:C++ COM编程之什么是接口?