上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下继承虚函数
继承关系图
class A { virtual aa(){}; }; class B : public virtual A { char j[3];//入加一个变量是为了看清楚class中的vfptr放在什么置位 public: virtual bb(){}; }; class C : public B { char i[3]; public: virtual cc(){}; }; #include <iostream> using namespace std; int main() { A aa; int a = sizeof(aa); B bb; int b = sizeof(bb); C cc; int c = sizeof(cc); printf("a= %d\nb=%d\nc=%d\n",a,b,c); return 0; }
上面是内存图
群体的单步调试内存图如下
图一 单层虚继承刚到aa时的图
图二 单层继承aa运行完以后的图
从图一可以看出,变量在内存的置位都定下来了(例如bb.j、cc.i、cc.B.j,还有与类有关的a、b、c三个变量),与虚函数有关的aa._vfptr、bb._vfptr等的内存值还是空的(0xcccccccc)然后到了图二以可就看出aa._vfptr的值就定确了,这说明虚函数表针指(vptr)在运行时才定确真正的值。
图三 单层虚继承刚到bb时的图
图四 单层继承bb运行完以后的图
图三与图四的较比可以看出,虚函数针指_vfptr或者vptr在运行时才定确,一样指向virtual base class的类的偏移或者针指也是在运行时定确。
图五 单层虚继承刚到aa时的图
图六 单层继承aa运行完以后的图
图七 虚函数表
虚函数表在程序代码以后,旁边以四个节字的0开隔。
文章结束给大家分享下程序员的一些笑话语录:
苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)