c++多继承多态的实例详解

  

<强> c++多继承多态的实现
  

  

如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表。
  

  

多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定调用函数的地址,在调用虚函数的时候,去查询虚函数指针所指向的虚函数表。
  

  

派生类生成的对象中的虚函数指针指向的是派生类的虚函数表,因此无论是基类还是派生来调用,都是查询的是派生类的表,调用的是派生类的函数。

  

如果发生了多继承,多个基类中都有虚函数,那么该是怎样的呢?虚函数指针如何排列,多个基类的指针为什么能够同时指向派生类对象,同时发生多态?
  

  

请看下面这段程序

        # include & lt; stdio.h>   # include & lt; iostream>   使用名称空间性病;      类Base1 {      公众:   空白有趣()   {   printf("这是Base1有趣\ n ");   }   虚拟空间fun1 ()   {   printf("这是Base1 fun1 \ n”);   }   };      类Base2 {   公众:   空白有趣()   {   printf("这是Base2有趣\ n ");   }   虚拟空间fun2 ()   {   printf("这是Base2 fun1 \ n ");   }   };      派生类:公共Base1 Base2 {   公众:   空白有趣()   {   printf(“这是派生的有趣\ n”);   }   空白fun1 ()   {   printf("这是派生fun1 \ n ");   }   空白fun2 ()   {   printf("这是派生fun2 \ n ");   }   };      int main ()   {   派生* pd=新获得();   pd Base1 * p1=(Base1 *);   pd Base2 * p2=(Base2 *);   p1→有趣();   p2→有趣();   p1→fun1 ();   p2→fun2 ();   printf (" Base1 p1: % x \ n”, p1);   printf (" Base2 p2: % x \ n”, p2);   返回0;   }      之前      

运行结果如下

        feng@mint ~//c++/cpp_muti_drived代码   美元。/muti_derived   这是Base1有趣   这是Base2有趣   这是派生fun1   这是派生fun2   Base1 p1:2097c20   Base2 p2:2097c28   之前      

派生类分别继承了Base1和Base2,根据结果来看,均发生了多态。基类指针调用函数,调用的均是派生类的对象。
  

  

通过打印出了p1和p2的地址,发现他们相差了8个字节,就能明白了,在做类型转换的过程中,如果把地址传给第二个基类的指针的时候会自动把地址减去8,在64位系统下,刚好是一个指针的长度。因此p2指向的实际上是第二个虚函数指针的地址,这样,就能够实现多继承的多态了。

  

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持。
  

c++多继承多态的实例详解