多态(day10)
- 二十二 多态(Polymorphic)
- 函数重写(虚函数覆盖)、多态概念
- 如果将基类中的某个成员函数声明为虚函数,那么子类与其具有相同原型的成员函数就也将是虚函数,并且对基类中的版本形成覆盖。
- 这时,通过指向子类对象的基类指针,或者引用子类对象的基类引用,调用该虚函数,实际被执行的将是子类中覆盖版本,而不是基类中的原始版本,这种语法现象称为多态.
- eg:
- class Base{
- public:
- virtual void foo(void){
- cout << "Base::foo" << endl;
- }
- };
- class Derived:public Base{
- public:
- void foo(void){
- cout << "Derived::foo" << endl;
- }
- };
- int main(void){
- Derived d;
- Base* pb=&d;//pb指向子类对象的基类指针
- Base& rb=d;//rb引用子类对象的基类引用
- pb->foo();//Derived::foo
- rb->foo();//Derived::foo
- }
- 函数重写要求(虚函数覆盖条件)
- )类中普通的成员函数可以声明为虚函数,而全局函数、类中的静态成员函数、构造函数都不能声明为虚函数。
- 注:析构函数可以为虚函数(后面讲)
- )只有在基类中以virtual关键字修饰的函数,才能作为虚函数被子类覆盖,而与子类中virtual关键字无关。
- )虚函数在子类中的覆盖版本和改函数在基类中原始版本要拥有相同的函数签名,即函数名、形参表、常属性必须严格一致.
- )如果基类中的虚函数返回基本类型的数据,那么子类的覆盖版本必须返回相同的类型。
- )如果基类的虚函数返回类类型指针(A*)或引用(A&),那么允许子类返回其子类的指针(B*)或引用(B&)。--类型协变
- class A{};
- class B:public A{};
- 多态的条件
- )在满足虚函数覆盖前提下,必须要通过指针或引用调用该虚函数,才能表现出来。
- )调用虚函数的指针也可以是this指针,只要它是一个指针子类对象的基类指针,调用虚函数时,同样可以表现多态的特性。//重点掌握
- 纯虚函数、抽象类和纯抽象类
- )纯虚函数
- virtual 返回类型 函数名(形参表)[const]=;
- )抽象类
- 如果一个类中包含纯虚函数,那么这个类就是抽象类,抽象类不能创建对象。
- )纯抽象类(有名接口类)
- 如果一个抽象类除了构造函数和析构函数以外的所有成员函数都是纯虚函数,那么该类就是纯抽象类。
- 注:如果子类没有覆盖抽象基类的纯虚函数,那么该子类就也是一个抽象类,类的抽象属性可以被继承.
- eg:PDF文档阅读器
- 多态实现原理(了解)
- 通过虚函数表和动态绑定,参考poly.jpg
- )动态绑定会增加内存开销
- )虚函数调用会增加时间开销
- )虚函数不能被内联优化
- 结论:如果没有多态的语法要求,最好不要使用虚函数。
- 虚析构函数
- )基类析构函数不能调用子类的析构函数,对一个指向子类对象的基类指针使用delete运算符,实际被执行的仅是基类的析构函数,所释放的仅是基类子对象构造时的分配的动态资源,而子类特有的动态资源将会形成内存泄露。
- )将基类的析构函数声明为虚函数,那么子类的析构函数就也是一个虚函数,并且可以对基类的虚析构函数形成有效的覆盖,可以表现多态的特性。
- )这时delete一个指向子类对象的基类指针,实际被调用的将是子类的析构函数,而子类的析构函数在执行后又会自动调用基类的析构函数,避免内存泄露。
- //笔试题:虚析构函数的作用?
- =========================================
- 练习:薪资计算
- 员工
- / | \
- 技术员 经理 销售员
- \ / \ /
- 技术主管 销售主管
- 所有员工:姓名、工号、职位等级、出勤率
- 经理:绩效奖金(元/月)
- 技术员:研发津贴(元/小时)
- 销售员:提成比率(x%)
- 薪资=基本工资+绩效工资
- 基本工资计算=职位等级的固定额度*出勤率(输入);
- 绩效工资根据具体的职位而定:
- 普通员工:基本工资一半
- 经理:绩效奖金*绩效因数(输入)
- 技术员:研发津贴*工作小时数*进度因数(输入)
- 销售员:提成比率*销售额度(输入)
- 技术主管:(技术员绩效工资+经理绩效工资)/
- 销售主管:(销售员绩效工资+经理绩效工资)/
- 结果:打印员工信息,输入必要数,计算和打印工资
- class 员工{
- double 计算工资(){
- return 基本工资() + 绩效工资();
- }
- virutal void 绩效工资(){}
- };
- class 技术员:public 员工{
- void 绩效工资(){}
- }
- int main(){
- 员工对象.计算工资();
- 技术员对象.计算工资();
- }
多态(day10)的更多相关文章
- 【JAVA零基础入门系列】Day10 Java中的数组
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...
- 【JAVA零基础入门系列】Day13 Java类的继承与多态
继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...
- 01 语言基础+高级:1-4 接口与多态_day10【接口、多态】&&day11【final、匿名内部类】
day10[接口.多态] 接口三大特征——多态引用类型转换 教学目标写出定义接口的格式写出实现接口的格式说出接口中成员的特点能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型 day10_ ...
- Java(171-194)【接口、多态】
1.接口概述与生活举例 接口就是一种公共的规范标准 只要符合规范标准,就可以大家通用 2.接口的定义基本格式 public interface 接口名称 { // 抽象方法 / ...
- Java中的多态
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- C#非常重要基础之多态
前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...
- C++多态详解
多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...
- 【那些年关于java多态应用】
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...
随机推荐
- PHP array_flip()
定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错. 语 ...
- PHP array_diff_key()
定义和用法 array_diff_key() 函数返回一个数组,该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键. 语法 array_diff_key(array1,array2,ar ...
- HDU 4503
可以反过来求不是相同关系的小朋友.相当于染色问题吧. 对于A小朋友,它的T个朋友和另外的(N-1-T)个同学就可以组成一个这样的三角形.T*(N-1-T),由于一条非染色边被计算两次,所以除以2. # ...
- SuperSocket内置的命令行协议的解析
SuperSocket\SocketBase\Protocol\TerminatorReceiveFilter.cs /// <summary> /// Filters received ...
- RTP协议分析和详解
一.RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RF ...
- EOJ 3384 食物链
动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1-N 编号.每个动物都是 A,B,C 中的一种,但是我们并不知道它到 ...
- logistic regression二分类算法推导
- IP Address
http://poj.org/problem?id=2105 #include<stdio.h> #include<string.h> int main() { ]; ] = ...
- pom.xml报错:Failure to find org.apache.maven.doxia:doxia-logging-api:jar:1.1 in http://repo.
在maven本地库中找到对应的地址:org.apache.maven.doxia找到对应的文件:doxia-logging-api发现文件中包含有lastUpdated字样,表示该文件并未下载完成,然 ...
- ZOJ2477 Magic Cube
题目: This is a very popular game for children. In this game, there's a cube, which consists of 3 * 3 ...