面向兑现编程(四):多态
C++ 多态
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
下面的实例中,基类 Shape 被派生为两个类,如下所示:
实例
#include <iostream>
using namespace std;class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}int area(){cout << "Parent class area :" <<endl;return 0;}
};
class Rectangle: public Shape{public:Rectangle( int a=0, int b=0):Shape(a, b) { }int area (){ cout << "Rectangle class area :" <<endl;return (width * height); }
};
class Triangle: public Shape{public:Triangle( int a=0, int b=0):Shape(a, b) { }int area (){ cout << "Triangle class area :" <<endl;return (width * height / 2); }
};
// 程序的主函数
int main( )
{Shape *shape;Rectangle rec(10,7);Triangle tri(10,5);// 存储矩形的地址shape = &rec;// 调用矩形的求面积函数 areashape->area();// 存储三角形的地址shape = &tri;// 调用三角形的求面积函数 areashape->area();return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Parent class area
Parent class area
导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。
但现在,让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area(){cout << "Parent class area :" <<endl;return 0;}
};
修改后,当编译和执行前面的实例代码时,它会产生以下结果:
Rectangle class area
Triangle class area
此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。
正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
虚函数
虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
纯虚函数
您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
我们可以把基类中的虚函数 area() 改写如下:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0;
};
= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数。
面向兑现编程(四):多态相关推荐
- java的知识点13——多态、对象的转型(casting)、final关键字、抽象方法和抽象类、接口的作用、如何定义和使用接口?、接口的多继承、面向接口编程
多态 多态指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同. 多态的要点: 1. 多态是方法的多态,不是属性的多态(多态与属性无关). 2. 多态的存在 ...
- C语言面向对象编程(四):面向接口编程
Java 中有 interface 关键字,C++ 中有抽象类或纯虚类可以与 interface 比拟,C 语言中也可以实现类似的特性. 在面试 Java 程序员时我经常问的一个问题是:接口和抽象类有 ...
- 第四十六期:最近程序员频繁被抓,如何避免面向监狱编程?!
最近,有很多关于程序员被抓甚至被判刑的新闻在朋友圈疯传:"某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓.某公司利用爬虫抓取用户信息,最后被发现,导致该公司的程序员 ...
- Spring学习之旅(四):面向切面编程(AOP)
Spring框架的核心是依赖注入和面向切面编程 面向切面(AOP)的术语是理解AOP的重要内容: 一.通知(Advice):通知定义了切面是什么,定义了切面的功能代码以及什么时候使用. Spring切 ...
- java 接口,接口的特性,接口实现多态,面向接口编程
package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式* 形式:public interface 接口名称{}* 接口不能拥有构造方法,不 ...
- Spring(四):面向切面编程AOP
2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...
- 最新最全面的Spring详解(四)——面向切面编程
前言 本文为 [Spring]面向切面编程 相关知识,下边将对AOP概述(包含什么是AOP.AOP相关术语.Spring AOP通知类型),Spring AOP能力和目标,AOP代理,@AspectJ ...
- 为什么有人说面向对象编程就是面向接口编程?
"面向对象编程就是面向接口编程" 这句话相信, 很多人都在网上见过, 装b利器. 我一开始也是这么想的, 那些装b者丢下这一句, 就没下文了. 首先, 我认为这句话是1个假命题. ...
- 软件设计模式—面向接口编程
原文作者:laoer2009 原文地址:设计模式之面向接口编程 01第一次需求 玩家有很多属性,例如:身高,性别 blalalala ,玩家可以攻击其他玩家.产品狗YY妹子写程序也是很利索,一天就把程 ...
最新文章
- 最短路之Dijkstra算法
- 如何在nginx中缓存静态文件
- Ubuntu配置上位机Blackfin开发环境手记
- 来个硬货——长文解读:基于业务场景的MySQL千万级大表优化
- java掌握_掌握Java 11的Constantdynamic
- C#:判断某个对象有没有某个键的方法
- 邻接矩阵(图的存储)
- 优动漫PAINT下载的素材找不到怎么办?
- CVPR2020 Rotate-and-Render: Unsupervised Photorealistic Face Rotation from Single-View Images论文笔记
- 门户网站开发价格一般需要多少钱?
- 仿蘑菇街界面应用(1)
- HTML-img图片详解
- 软件产品的增值税税率该如何选择?
- Customizing Navigation Bar and Status Bar in iOS 7
- 使用Vue写一个登录页面
- 微信小程序渗透测试技巧
- python开发cms 教程_django CMS 入门教程
- idea下git 错误 error: unable to read askpass response from 'C:\Users\ASUS\.IntelliJIdea2019.1\system\tm
- linux查看显卡型号p4卡或者t4卡_Linux查看显卡信息
- VLC 播放H264 数据流
热门文章
- linux创建新用户及权限
- JavaScript中prompt的使用
- 时序分析基本概念介绍——STA概述
- mysql单库tps_简单计算mysql 的QPS,TPS
- 虚拟机VMware的Ubuntu下安装tensorflow详解
- 计算机网络的硬盘组成,大卸八块!编辑为你揭秘硬盘的内部结构
- ubuntu下安装PCL并测试(含视频安装过程记录)
- Whitelabel Error Page : spring boot项目启动后,无法访问@RequestMapping标注的请求
- 一起谈.NET技术,浅析五大ASP.NET数据控件
- linux服务器架设指南笔记