收藏 分享(赏)

8C++继承.ppt

上传人:dzzj200808 文档编号:3198068 上传时间:2018-10-07 格式:PPT 页数:33 大小:567KB
下载 相关 举报
8C++继承.ppt_第1页
第1页 / 共33页
8C++继承.ppt_第2页
第2页 / 共33页
8C++继承.ppt_第3页
第3页 / 共33页
8C++继承.ppt_第4页
第4页 / 共33页
8C++继承.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、重庆邮电大学计算机科学与技术学院 冯 潇 ,继承,2018/10/7,主要内容,派生新类 继承的访问控制权限 定义派生类 派生类对象的初始化和析构 派生类的构造函数 派生类的析构,2018/10/7,重点、难点,继承的访问权限控制 派生类的生成 派生类对象的初始化和析构,2018/10/7,简单人事管理程序,为某公司编写一个人事管理程序,计算每个月公司的薪水支出总额,并显示每个雇员的人事信息 (员工编号、姓名、部门、薪水)。 该公司员工主要有经理、销售经理、销售员。其中经理月薪为8000,销售经理月薪为4000,同时要对所售商品按当月商品营业额的5%进行提成,销售员月薪分为底薪加提成(底薪15

2、00,提成5%),2018/10/7,分析,面向对象程序设计先从问题中包含的类入手 问题中包含的类别主要有: Seller、Manager、SaleManager3种 ,首先设计出这3个类别 找出这些类的属性和行为,2018/10/7,class Seller public:Seller(char*pid, char* n, char* d,double p,double c);void print() const; /常成员函数double GetSalary(double sale) const; /根据营业额sale提成 private:string id; /员工编号string na

3、me; /姓名string dept; /部门double base_pay; /底薪double commission; /提成率 ;,Seller类的设计,2018/10/7,Manager类的设计,class Manager public:Manager(char*pid, char* n, short l,double p);void print() const;double GetSalary() const; private:string id; /员工编号string name; /姓名short level; /行政级别double base_pay; /固定工资 ;,2018

4、/10/7,SaleManager类的设计,class SaleManager public:SaleManager();void print() const;double GetSalary(double sale); private:string id; /员工编号string name; /姓名string dept; /部门short level; /行政级别double base_pay; /固定工资double commission; /提成率 ;,整个软件行业的目标是减少重复,2018/10/7,整个问题 的类图,利用继承关系提高类的可重用性,2018/10/7,类的层次结构,继

5、承体现一般性和特殊性之间的关系 C+编译器能够提供机制保证派生类自动继承基类的所有特性 继承提高了编程效率和程序的正确性 从效率等方面考虑,一般类的嵌套层次不超过7层,2018/10/7,基类(父类),除了基类的构造函数、析构函数和operator =,派生类自动吸收基类的其他所有成员 -C+编程思想,2018/10/7,三类对象的内存分布,C+编译器提供机制保证基类成员自动继承到派生类对象中,2018/10/7,派生新类的过程,C+能够保证派生类自动地(隐式)继承基类的绝大部分成员 派生类不能继承基类的构造函数、析构函数以及operator = 派生类中可以定义新成员 派生类可以改写基类成员

6、,2018/10/7,3个类的定义格式,首先定义Employee类: class Employee ; Seller类: class Seller :public Employee /继承自Employee ; Manager类: class Manager :public Employee /继承自Employee ;,2018/10/7,派生类的定义,定义格式: class : ; 其中继承方式分为:public、private、protected 若继承方式缺省,表示私有继承 派生类定义之前一定要先完成基类的定义,包括实现基类的成员函数,2018/10/7,访问权限控制,继承分为3种方式

7、: public、private、protected 三种继承方式下派生类中基类成员的访问属性,2018/10/7,Employee类的定义,class Employee public:Employee( char* pid, char* n, double d);void print() const; double GetSalary() const /留待派生类改写protected:string id;string name;double base_pay; ;,2018/10/7,print()函数实现,void Employee:print() const cout “id:“ id

8、 endl;cout “name:“ name endl;cout “base pay:“ base_pay endl; ,一定要先定义完基类才能定义派生类,2018/10/7,Seller类的定义,class Seller: public Employee public:Seller(char*pid, char* n, char* d,double b,double c);void print() const; /改写基类同名成员double GetSalary(double sale) const; /根据营业额sale提成 private:string dept; /部门double

9、commission; /提成率 ;,2018/10/7,print()函数实现,/派生类同名函数屏蔽基类同名函数 void Seller:print() const Employee:print(); /显式调用基类同名成员函数cout“department:“deptendl;cout“commission:“ commission endl; ,void Seller:print() const print(); /去掉Employee:会出现什么情况? ,2018/10/7,double Seller:GetSalary(double sale) const double total

10、= sale*commission + base_pay;return total; ,GetSalary()函数实现,2018/10/7,派生类对象的初始化,通过例子观察 在初始化派生类对象的过程中,编译器 先调用基类的构造函数初始化基类成员 如有对象成员,再调用对象成员的构造函数初始化对象成员 最后调用派生类的构造函数初始化派生类成员 若用户没有在派生类构造函数成员初始化表中显式初始化基类成员,基类成员的初始化由编译器自动完成 观察例4-4和思考题4-4,2018/10/7,定义格式:若基类没有显式定义构造函数,派生类构造函数可以省略对基类构造函数的调用,采用隐含调用 当基类构造函数使用参

11、数时,派生类必须定义构造函数,提供将参数传递给基类构造函数的途径,派生类构造函数的定义,():(),() ; /成员初始化列表总是在构造函数定义时指定,而非在构造函数声明中指定,2018/10/7,Seller类构造函数,Seller(char*pid, char* n, char* d,double b,double c) :Employee(pid, n, b) dept = d;commission = c; ,2018/10/7,析构函数的调用顺序和构造函数相反: 先调用派生类析构函数 若派生类中包含对象成员(如string name),还应调用该成员的析构函数 最后才调用基类析构函数

12、,派生类的析构函数,2018/10/7,开放-封闭原则,The Open-closed Principle(OCP) 软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改 对扩展开放(Open for extension) : 模块的行为可以扩展,如增加派生类、增加全局函数等等 对更改封闭(Closed for modification): 对模块行为进行扩展时,不必改动模块的源代码或者二进制代码 OCP原则是“可复用设计”的重要基石,2018/10/7,Liskov替换原则(LSP),LSP(里氏原则) 子类(sub type)必须能替换掉它们的基类型(base type) 如果每一

13、个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换为o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型: 一个继承是否符合里氏代换原则,可以判断该继承是否合理(是否隐藏有缺陷) 如何测试合理性可以参考敏捷软件开发原则、模式、实践第10章 LSP是实现OCP的主要原则之一。,2018/10/7,向上转型(里氏原则的解释),公有派生类实际具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。 在需要基类对象的任何地方都可以使用公有派生类的对象来替代: 派生类的对象可以赋值给基类对象。 派生类的对象可以初始化基类的引用。 派生类对

14、象的地址可以赋给基类类型的指针,2018/10/7,作业,参见doc文档,2018/10/7,Ammeter类声明,class Ammeter public:Ammeter(double r = 0);void print() const;void setReading(double amount); /计电流量 protected:double reading; /电表度数static double price; /电费单价 ;,2018/10/7,Smartmeter类声明,class Smartmeter:public Ammeter public:Smartmeter(double r

15、 = 0);void setPrepaid(double pre); /存入预付费double CalcCharge() ; /计算剩余款 void print() const; private:double prepaid;/预付费double balance;/剩余款 ;,2018/10/7,int main() Smartmeter meter; /电表底度为0度int val = 1; /当前耗电度数double balance;meter.setPrepaid(50); /存入预付费50元meter.print();dometer.setReading(val+); /每耗电1度,电表读数一次balance = meter.CalcCharge(); /计费一次 while(balance 1e-1); /剩余款不足时断电meter.print(); return 0; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报