多态的现象及本质剖析(一)
来源:互联网 发布:游戏网络流行词语大全 编辑:程序博客网 时间:2024/06/06 15:40
多态的现象,同样的调用语句有着不同的表现形态。
#include <iostream>using namespace std;class animal{public: virtual void func() = 0;//纯虚函数protected:private: //char *voice = "我是annimal怎么叫?";};class duck:public animal{public: virtual void func()//纯虚函数重写 { cout << voice << endl; }protected:private: char *voice = "我是鸭子,嘎嘎嘎";};class cat:public animal{public: virtual void func()//纯虚函数重写 { cout << voice << endl; }protected:private: char *voice = "我是小猫,喵喵喵";};//框架void cry(animal *p)//赋值兼容性原则,可传递子类指针{ p->func();}int main(){ duck d1; cat c1; cry(&d1);//运行效果:我是鸭子,嘎嘎嘎 cry(&c1);//运行效果:我是小猫,喵喵喵 system("pause"); return 0;}
上例中同样是调用cry()函数,不同的对象传入,可以调用各自对象中的方法,产生不同的现象。这个现象便是多态。
从上述代码中可以总结出多态产生的条件有三个:
1、父类子类继承关系。
2、(纯)虚函数重写。
3、父类指针(引用)指向子类对象。
virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际对象类型来判断如何调用。
C++多态实现原理:
当类中声明(纯)虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表是由编译器自动生成与维护的
virtual成员函数会被编译器放入虚函数表中
存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)
拿上述代码duck类来说,编译的时候,编译器会自动为duck加上一个VPTR指针,duck当执行d1类初始化的时候,编译器就会自动创建一个d1的虚函数表,存放d1的func函数指针,而VPTR也会指向这个虚函数表。
1 0
- 多态的现象及本质剖析(一)
- 透过现象看本质(一)
- 关于js中的所谓的for循环典型问题的剖析,通过现象看本质
- 引用的本质剖析
- 透过现象看本质 - 壮志未酬的BPEL
- C++引用的本质剖析
- 数组做形参的本质剖析
- 多普勒效应的原理及应用 一 多普勒现象的发现
- java多线程(一)Race Condition现象及产生的原因
- java多线程(一)Race Condition现象及产生的原因
- java多线程(一)Race Condition现象及产生的原因
- java多线程(一)Race Condition现象及产生的原因
- Muduo库的框架剖析及总结(一)
- 多态的本质
- OC语言中类的三大特性及本质(一)
- memcache常见现象(一)雪崩现象
- 剖析IT培训市场的五大怪现象
- 现象和本质
- HIVE入门
- 信息奥赛 有一块金属,三个人对它们进行判断
- android动画的使用(下-高级用法)
- Android音乐播放器的简单实现
- Atitit 提升团队开发效率项目进度的一些大的流程方向attilax总结
- 多态的现象及本质剖析(一)
- 给我一个Path,还你一个酷炫动画
- webpack入坑之旅(五)加载vue单文件组件
- 通过两张图更好的了解unity
- Android zxingLibrary黑屏解决办法
- Laravel 模型使用scope前缀的方法
- 解决android studio Error:Failed to open zip file. Gradle's dependency
- hibernate连接数据库时候提示'hibernate.dialect' must be set when no Connection avalable
- webpack入坑之旅(六)配合vue-router实现SPA