c++多继承多态
来源:互联网 发布:java valueof方法 编辑:程序博客网 时间:2024/05/24 07:33
C++多继承多态的实现
如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表。
多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定调用函数的地址,在调用虚函数的时候,去查询虚函数指针所指向的虚函数表。
派生类生成的对象中的虚函数指针指向的是派生类的虚函数表,因此无论是基类还是派生来调用,都是查询的是派生类的表,调用的是派生类的函数。
如果发生了多继承,多个基类中都有虚函数,那么该是怎样的呢?虚函数指针如何排列,多个基类的指针为什么能够同时指向派生类对象,同时发生多态?
请看下面这段程序
#include <stdio.h>#include <iostream>using namespace std;class Base1{ public: void fun() { printf("this is Base1 fun\n"); } virtual void fun1() { printf("this is Base1 fun1\n"); }};class Base2{ public: void fun() { printf("this is Base2 fun\n"); } virtual void fun2() { printf("this is Base2 fun1\n"); }};class Derived : public Base1,public Base2{ public: void fun() { printf("this is Derived fun\n"); } void fun1() { printf("this is Derived fun1\n"); } void fun2() { printf("this is Derived fun2\n"); }};int main(){ Derived *pd = new Derived(); Base1 *p1 = (Base1 *)pd; Base2 *p2 = (Base2 *)pd; p1->fun(); p2->fun(); p1->fun1(); p2->fun2(); printf("Base1 p1:%x\n", p1); printf("Base2 p2:%x\n", p2); return 0;}
运行结果如下
feng@mint ~/code/c++/cpp_muti_drived $ ./muti_derived this is Base1 funthis is Base2 funthis is Derived fun1this is Derived fun2Base1 p1:2097c20Base2 p2:2097c28
Derived类分别继承了Base1和Base2,根据结果来看,均发生了多态。基类指针调用函数,调用的均是派生类的对象。
通过打印出了p1和p2的地址,发现他们相差了8个字节,就能明白了,在做类型转换的过程中,如果把地址传给第二个基类的指针的时候会自动把地址减去8,在64位系统下,刚好是一个指针的长度。因此p2指向的实际上是第二个虚函数指针的地址,这样,就能够实现多继承的多态了。
阅读全文
0 0
- C继承和多态
- C++--继承与多态
- C++:多态公有继承
- 【C++】继承和多态之——菱形继承
- objective C多继承
- 【c++】多继承
- [c++]多继承
- C++_多继承
- C中的继承和多态
- 【转帖】C继承和多态
- C#中的接口和继承多态
- 使用继承的多态(C#)
- 继承和多态理解(C#)
- C中的继承与多态
- C语言实现继承和多态
- C中的继承和多态
- C#—继承和多态
- C语言实现继承和多态
- 1. 不高兴的津津
- STL之list容器详解
- CommonJS、AMD、CMD、NodeJs、RequireJS到底有什么联系?
- Mysql安装流程
- C#对DataTable里数据排序的方法
- c++多继承多态
- 汉诺塔VII
- 实例探索Java模式之路——代理模式
- C# 事件与委托—个人理解
- 2. 猴子分桃
- session 设置生存时间
- 进程及其相关概念
- 序列化和反序列化的简单理解
- Android播放音乐