C+学习之多态篇(虚函数)
2016-01-25 19:05
357 查看
一、什么事多态?
多态的定义:相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。
二、多态分类:
定义不太好理解,其实或字前后说明了两个不同类型的多态形式:即静态多态(早绑定)和动态多态(晚绑定)。
1.静态多态(早绑定)
看下图中代码:
两个calcArea()函数互为重载,互为重载的函数在main()函数中调用的时候会根据参数的不同来调用各自的函数,这种调用关系是很早就确定下来的,即在程序运行之前,在编译阶段就已经确定下来要使用哪个函数了,这种情况就叫做早绑定或静态多态。
2.动态多态
动态多态的一个特性就是用父类的指针去指向子类的对象,并用父类的指针去调用相应的calcArea()函数去执行求面积的操作,如果父类的calcArea()函数不是virtual,那么下面的调用代码只会调用父类的calcArea()函数,没有实现多态;如果父类的calcArea()函数已经声明为virtual的,那么下面的调用代码就会调用各个子类的calcArea()函数,即对不同的子类对象实行相同的指令,做出了不同的动作响应。
注意:
(1)父类的calcArea()函数必须和子类的calcArea()函数返回值参数名称都一模一样才行,不然无法构成多态;
(2)父类的calcArea()函数声明为virtual以后,虚的特性是可以继承的,即子类的calcArea()函数写不写virtual,都已经是虚函数了,但是好的习惯是写上,明了。
多态几个特点简单归结如下:
(1)多态具体到语法是指:使用父类指针指向子类对象,并可以通过该指针调用子类的方法;
(2)产生多态的基础是存在继承关系,没有继承就没有多态;
(3)必须使用virtual才能在多个子类之间建立多态关系。
多态的定义:相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。
二、多态分类:
定义不太好理解,其实或字前后说明了两个不同类型的多态形式:即静态多态(早绑定)和动态多态(晚绑定)。
1.静态多态(早绑定)
看下图中代码:
两个calcArea()函数互为重载,互为重载的函数在main()函数中调用的时候会根据参数的不同来调用各自的函数,这种调用关系是很早就确定下来的,即在程序运行之前,在编译阶段就已经确定下来要使用哪个函数了,这种情况就叫做早绑定或静态多态。
2.动态多态
动态多态的一个特性就是用父类的指针去指向子类的对象,并用父类的指针去调用相应的calcArea()函数去执行求面积的操作,如果父类的calcArea()函数不是virtual,那么下面的调用代码只会调用父类的calcArea()函数,没有实现多态;如果父类的calcArea()函数已经声明为virtual的,那么下面的调用代码就会调用各个子类的calcArea()函数,即对不同的子类对象实行相同的指令,做出了不同的动作响应。
注意:
(1)父类的calcArea()函数必须和子类的calcArea()函数返回值参数名称都一模一样才行,不然无法构成多态;
(2)父类的calcArea()函数声明为virtual以后,虚的特性是可以继承的,即子类的calcArea()函数写不写virtual,都已经是虚函数了,但是好的习惯是写上,明了。
多态几个特点简单归结如下:
(1)多态具体到语法是指:使用父类指针指向子类对象,并可以通过该指针调用子类的方法;
(2)产生多态的基础是存在继承关系,没有继承就没有多态;
(3)必须使用virtual才能在多个子类之间建立多态关系。
相关文章推荐
- Python动态加载模块的3种方法
- Performance Comparison - Identity() x NewId() x NewSequentialId
- ARM嵌入式开发中的GCC内联汇编简介
- 环境搭建
- Linux 4.0 正式发布 彻底告别计算机重启时代
- Hibernate的saveOrUpdate方法原理
- 开发工具之Git(将本地eclipse工程上传至GitCafe服务器)
- 黑马程序员-----------java杂谈篇之第一篇
- 【计算机基础】 经常使用的排序算法的时间复杂度和空间复杂度
- hdu 2520 我是菜鸟我怕谁
- Android调用另一个App界面
- 2016.01.22 简单动画
- Caffe BaseDataLayer.cpp BasePrefetchingDataLayer.cpp DataLayer.cpp 学习
- tomcat 两个端口部署应用
- 大智慧小问题
- 检测是否联网
- ORACLE触发器详解
- 基于TFS实践敏捷-可视化管理
- poj 3984 迷宫问题 宽度搜索 一个终点
- location.false(true)