多态的对象模型

来源:互联网 发布:linux sh脚本编写 编辑:程序博客网 时间:2024/06/02 05:21

多态的对象模型,有单继承与多继承,复杂点的有菱形继承和菱形虚拟继承。而需要理解多态这个概念,就得先知道虚函数,而虚函数里有叫虚函数表的东西,而C++中的虚函数的主要作用,就是来实现其多态的,简单点来说就是父类的指针或引用调用重写的虚函数,当父类指针/引用指向父类对象时调用父类的虚函数,当指向子类对象时则调用子类虚函数,一个指针,根据传参类型进而改变调用的虚函数,这便是多态

先说下虚函数表,顾名思义跟虚函数有关,这张表的内容存的就是调用时所需的虚函数的地址,这张虚函数表解决了虚函数的重写的问题。


下面先从简单虚函数谈起吧,后面都用画板截图方式进行阐述,可能有点乱,见谅。


这里先创建一个Base类型的 b1实例化变量,而Base中存在virtual虚函数,则需要在实例化b1时先将虚函数表放入其中,如vs2008监视窗口里所示,虚函数表位于b1中的最上面的位置。


通过上面的图板解释,你已经有所了解虚函数和虚函数表了吧,下面在深入一点,讲讲单继承,话不多说,上图~~~~

下面图中的一串字不一定正确,请持怀疑的态度:



在我写完下面的多继承时,便推翻了我在画单继承时的结论,下面请观赏下部图片:


看到这个图是不是忽然有点头晕了呢。。。唉,我的头怎么也有点晕乎乎的呢,没事,我带领大家来解读这张"应该""貌似"是我画的图,首先,有三个类,两个基类,一个子类,Base1是基类1,里面有虚函数virtual fun1()和virtual fun2(),还有b1,基类2是Base2,里面有虚函数virtual fun3(),virtual fun4(),子类Derive继承他们两个,首先可以看到d1,它重写,还继承了Base1,Base2,如我所想,在监视器中就是如此,两个虚表地址,指向两个虚表,分别是Base1和Base2,而子类中独有的fun5()在最前面的虚表中存放,不会另开一个虚表进行存放子类的虚函数,这里可以明白,回到单继承那张图的话中,于是我就想验证一下是不是存放的是“同一个”函数呢,于是我有创建了一个Base1类的b1,通过观察b1中虚表中存放虚函数的地址来验证我的单继承结论是否正确,正好如我所想,是错误的。它们地址不同,所以我知道了我自己的结论是错的,但我有创建了一个Base1类的b3,我还是不死心,于是查看了监视器,他的虚函数地址和b1相同,所以我又得出了一个结论(虽然不知道会不会又被推翻):当两个类型相同时,他们共用一个虚函数表,但是如果重写/覆盖时,则将另分配一个虚函数表进行存放(不是“同一个”虚函数)。在最后,通过两个框,可以知道了解d1和b1的存储结构。


讲到这里,我似乎感觉我的头更晕了,C++就是这样,如果你感觉你头晕,那么说明你在进步,如果你不头晕,两个结果,一是你可能还没入门,二是你已经精通C++,为了明天的不头晕,今天我们头更晕一点吧!!!




原创粉丝点击