二十一 继承(Inheritance)
...
子类的构造函数和析构函数
5.1 子类的构造函数
)如果子类构造函数没有显式指明基类子对象的初始化方式,那么该子对象将以无参方式被初始化。
)如果希望基类子对象以有参的方式被初始化,必须在子类构造函数的初始化表中显式指明。
class 子类:public 基类{
子类(...):基类(基类子对象构造实参表){}
};
)子类对象的构造过程
--》分配内存
--》构造基类子对象(按继承表顺序)
--》构造成员子对象(按声明顺序)
--》执行子类的构造代码 5.2 子类的析构函数
)子类的析构函数,会自动调用基类的析构函数,析构基类子对象。
)子类对象的销毁过程
--》执行子类的析构代码
--》析构成员子对象(按声明逆序)
--》析构基类子对象(按继承表逆序)
--》释放内存
)基类析构函数不能调用子类的析构函数,对一个指向子类对象的基类指针使用delete运算符,实际被执行的仅是基类的析构函数,所释放的仅是基类子对象构造时的分配的动态资源,而子类特有的动态资源将会形成内存泄露。
eg:
class A{
A(void){动态资源分配}
~A(void){动态资源销毁}
};
class B:class A{
B(void){动态资源分配}
~B(void){动态资源销毁}
};
A* pa = new B;//pa:指向子类对象的基类指针
delete pa;//子类析构函数执行不到,内存泄露
-------------------------
子类的拷贝构造和拷贝赋值
6.1 子类的拷贝构造
)子类没有定义拷贝构造函数,编译器会为子类提供缺省拷贝构造函数,该函数会自动调用基类的拷贝构造函数,初始化基类子对象。
)子类定义拷贝构造函数,需要使用初始化表,显式指明基类子对象也以拷贝方式进行初始化。
6.2 子类的拷贝赋值
)子类没有定义拷贝赋值操作符函数,编译器会提供缺省拷贝赋值函数,该函数会自动调用基类的拷贝赋值函数,复制基类子对象。
)子类定义拷贝赋值操作符函数,需要显式调用基类的拷贝赋值函数,完成对基类子对象的复制。 多重继承
)一个子类继承多个基类,这样继承方式称为多重继承。
eg:
技术员 经理
\ /
技术主管
eg:
电话 播放器 计算机
\ | /
智能手机 )向上造型时,编译器会根据各个基类子对象在子类对象中内存布局,进行适当的偏移计算,保证指针的类型和其所指向的目标对象类型一致。 )名字冲突问题
一个子类的多个基类存在相同的名字,当通过子类访问这些名字时,编译器会报歧义错误--名字冲突。
解决名字冲突的通用做法就是显式地通过作用域限定,指明所访问的名字属于哪一个基类。
如果产生冲突的名字是成员函数,并且参数不同,也可以通过using声明,让其在子类中形成重载,通过函数重载匹配解决冲突问题。 钻石继承
)一个子类的多个基类源自共同的祖先基类,这样继承结构称为钻石继承。
A(m_data)
/ \
B C
\ /
D
)公共基类(A)子对象,在汇聚子类(D)对象中,存在多个实例。在汇聚子类中,或者通过汇聚子类对象,去访问公共基类的成员,会因为继承路径不同而导致结果不一致。
)通过虚继承可以让公共基类(A)子对象,在汇聚子类(D)对象中的实例唯一,并且为所有子类共享,这样即使沿着不同的继承路径去访问公有基类的成员,结果也是一致的。 虚继承的语法
A(m_data)
/ \
B C(virtual)
\ /
D(负责构造虚基类子对象)
)在继承表中使用virutal关键字
)由汇聚子类的构造函数负责构造虚基类子对象
)公共基类的所有子类,都必须在构造函数的初始化表中显式指明其初始化方式,否则编译器将会选择以无参方式初始化。 ----------------------------
练习:薪资计算
员工
/ | \
技术员 经理 销售员
\ / \ /
技术主管 销售主管
所有员工:姓名、工号、职位等级、出勤率
经理:绩效奖金(元/月)
技术员:研发津贴(元/小时)
销售员:提成比率(x%) 薪资=基本工资+绩效工资
基本工资计算=职位等级的固定额度*出勤率(输入);
绩效工资根据具体的职位而定:
普通员工:基本工资一半
经理:绩效奖金*绩效因数(输入)
技术员:研发津贴*工作小时数*进度因数(输入)
销售员:提成比率*销售额度(输入) 技术主管:(技术员绩效工资+经理绩效工资)/
销售主管:(销售员绩效工资+经理绩效工资)/ 结果:打印员工信息,输入必要数,计算和打印工资

继承(day09)的更多相关文章

  1. Java之路---Day09(继承)

    2019-10-23-22:58:23 目录 1.继承 2.区分成员变量重名的方法 3.区分成员方法重名的方法 4.继承中重写与重载的区别 5.继承中覆盖重写的注意事项 6.继承中覆盖重写的设计原则 ...

  2. Java学习day09—-封装和继承

    封装 1.封装 1.1 封装的概念和实现 封装: 属性私有:将属性使用private修饰,表示此属性只能在本类中访问,不让外部直接访问 方法公开:针对每一个属性编写一对公开的方法 get set 分别 ...

  3. Python异常处理和进程线程-day09

    写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异 ...

  4. day09:Servlet详解

        day09 Servlet概述 生命周期方法: void init(ServletConfig):出生之后(1次): void service(ServletRequest request, ...

  5. java特性之二----继承

    1.继承的概述 ============================================================================================ ...

  6. 01 语言基础+高级:1-4 接口与多态_day09【继承、super、this、抽象类】

    day09[继承.super.this.抽象类] 三大特性——继承方法重写super关键字this关键字抽象类 教学目标能够解释类名作为参数和返回值类型能够写出类的继承格式能够说出继承的特点能够说出子 ...

  7. Java(152-170)【继承、super、this、抽象类】

    1.继承的概述 继承是多态的前提 继承主要解决的问题是共性抽取 2.继承的格式 在继承的关系中,子类可以当做父类看待 代码复用的效果 package cn.itcast.day09.demo01; / ...

  8. 358 day09字节流、字符流

    day09[字节流.字符流] 主要内容 IO流 字节流 字符流 异常处理 Properties 教学目标 [ ] 能够说出IO流的分类和功能 [ ] 能够使用字节输出流写出数据到文件 [ ] 能够使用 ...

  9. Java基础语法Day_08(继承、抽象)

    第1节 继承 day09_01_继承的概述 day09_02_继承的格式 day09_03_继承中成员变量的访问特点 day09_04_区分子类方法中重名的三种变量 day09_05_继承中成员方法的 ...

随机推荐

  1. .Net程序猿玩转Android开发---(6)线性布局LinearLayout

                                LinearLayout控件是Android中重要的布局控件,是一个线性控件,所谓线性控件的意思是指该控件里面的内容仅仅能水平或垂直排列.也就 ...

  2. 【JavaScript】正則表達式

    正則表達式,也不是第一次与它见面了.在我们学习ASP.NET视频的时候,验证控件的那个实例中.就有提到过它. 那个时候.都是在控件的属性中自己设置的,用的原理就是正則表達式,当时得感觉就是方便,强大, ...

  3. 【独立开发人员er Cocos2d-x实战 011】Cocos2dx 3.x命令行生成APK具体解释

    Cocos2d-x 3.6项目打包生成apk安卓应用文件,搭建安卓环境的步骤有点繁琐.但搭建一次之后,以后就会很快捷! 过程例如以下: 一.下载安卓环境:搭建Android环境须要用到Android ...

  4. 学习笔记——node.js

    node.js的作用在于,号称可以让服务器支持更多的连接.比如说,php + apche可以让服务器支持4000个并发连接,那么node.js + apche可以让服务器支持并发几万个. 为什么这么牛 ...

  5. K度限制MST poj 1639

    /* k度限制MST:有一个点的度<=k的MST poj 1639 要求1号点的度不超过k 求MST 我们先把1号点扔掉 跑MST 假设有sum个连通分支 然后把这sum个分支连到1上 就得到了 ...

  6. [NOIP 2016] 蚯蚓

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4721 [算法] 首先,我们可以维护一个堆,堆中存放蚯蚓的长度,由于除当前蚯蚓其他的蚯 ...

  7. How to add dependency on a Windows Service AFTER the service is installed

    his can also be done via an elevated command prompt using the sc command. The syntax is: sc config [ ...

  8. PCB拼板之单一矩形排样算法

    算法实现相关内容整理如下: 一.排样变量与关系 此算法,基于固定4边的尺寸遍历每个单只板的长宽得到最优解. 二.条件约束 基本约束条件(参考上图变量) 三.排样图形相同类型规律 由于计算量大,为了有效 ...

  9. Agri-Net(prim)

    http://poj.org/problem?id=1258 #include<stdio.h> #include<string.h> ; <<; int map[ ...

  10. poj2975 Nim(经典博弈)

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5866   Accepted: 2777 Description N ...