C++ 派生类与继承ppt课件.ppt

上传人:牧羊曲112 文档编号:1375495 上传时间:2022-11-16 格式:PPT 页数:42 大小:182.50KB
返回 下载 相关 举报
C++ 派生类与继承ppt课件.ppt_第1页
第1页 / 共42页
C++ 派生类与继承ppt课件.ppt_第2页
第2页 / 共42页
C++ 派生类与继承ppt课件.ppt_第3页
第3页 / 共42页
C++ 派生类与继承ppt课件.ppt_第4页
第4页 / 共42页
C++ 派生类与继承ppt课件.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C++ 派生类与继承ppt课件.ppt》由会员分享,可在线阅读,更多相关《C++ 派生类与继承ppt课件.ppt(42页珍藏版)》请在三一办公上搜索。

1、第4章 派生类与继承,继承在已有类的基础上建立一个新类的过程称为继承被继承的已有类称为基类(父类)派生在已有类的基础上新增自己的特性(属性与行为)而产生新类的过程称为派生派生出的新类称为派生类(子类),继承与派生的目的:实现代码的重用与扩充,4.1派生类的概念,4.1.1继承单继承派生类只从一个基类派生,多重继承一个派生类有两个或多个基类,多级派生(多层派生)派生类又作为基类,继续派生新的类,4.1.2派生类的声明class 派生类名:继承方式 基类名 /派生类新增的数据成员和成员函数; 继承方式:规定了如何访问从基类继承的成员,可以是private,protected,public三种方式.

2、,/定义一个基类class Person public: void print() / protected: string name; int age; char sex; ;,/定义一个派生类class Employee:public Person public: void print1() . private: string department; float salary; ;,由类Person继承出类Employee有三种继承方式 (1) 公有继承 class employee:public person / ; (2) 私有继承 class employee:private pers

3、on / ; (3) 保护继承 class employee:protected person / ;,4.1.3派生类的构成 派生类除了可以从基类继承成员外,还可以增加自己的数据成员和成员函数.这些新增的成员正是派生类不同于基类的关键所在,是派生类对基类的发展.,继承,新增(发展),继承与派生的目的:实现代码的重用与扩充,构造一个派生类一般过程:(1)派生类从基类接收成员 C+继承中,派生类把基类的全部成员(构造函数与析构函数除外)接收过来.(2)调整从基类接收来的成员(3)在派生类中增加新成员.,4.1.4基类成员在派生类中的访问属性 派生类继承基类中全体成员(除了构造函数与析构函数).这

4、些成员的访问属性在派生程中可以调整. 从基类继承来的成员在派生类的访问属性是由继承方式控制. class 派生类名:继承方式 基类名 / . 继承方式为public,protected,private.不同的继承方式,导致不同访问属性的基类成员在派生类的访问属性有所不同. 用公有继承方式建立的派生类称为公有派生类 用私有继承方式建立的派生类称为私有派生类 用保护继承方式建立的派生类称为保护派生类,表:基类成员在派生类中的访问属性,4.1.5 派生类对基类成员的访问规则 类的继承方式有 public(公有继承) protected(保护继承) private(私有继承) 不同的继承方式导致原来具

5、有不同访问属性的基类成员在派生类中的访问属性不同. 派生类对基类成员的访问形式有以下两种: (1)内部访问,派生类的新增成员函数对基类继承的成员的访问 (2)对象访问,在派生类的外部,以派生类的对象对基类继承来的成员的访问.,1.私有继承的访问规则,基类中的private成员,既不能被派生类的对象访问, 也不能被派生类的新增成员函数访问(内部访问).,class Base public: void setx(int n) x=n; void showx() cout xendl; private: int x;class Derived: private Base public: void s

6、etxy(ini n,int m) setx(n); y=m; void showxy(); cout x; coutyendl private: int y;,int main() Derived obj; obj.setx(10); obj.showx(); obj.setxy(20,30); obj.showxy(); return 0;,2.公有继承的访问规则,class Base public: void setxy(int m,int n) x=m; y=n; void showxy() cout x y endl; private: int x; protected: int y

7、; class Derived: public Base public: void setxyz(ini m,int n,int l) setxy(m,n); z=l; void showxyz(); cout x; couty; cout z; private: int z;,int main() Derived obj; obj.setxyz(30,40,50); obj.showxy(); obj.y=60; obj.showxyz(); return 0;,3.保护继承的访问规则,4.2派生类的构造函数与析构函数,派生类继承了基类的成员,实现了代码的重用,引入继承更主要的目的是代码的扩

8、充.所以,只有在派生类中加入新成员,派生才更有实际意义.派生类不能继承基类的构造函数,在派生类中对新增成员的初始化,加入派生类的构造函数,基类继承下来的成员初始化有基类构造函数完成.同样,当搞清对象时,也需要加入派生类的析构函数来执行清理工作.,4.2.1 派生类构造函数和析构函数的执行顺序,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤消派生类的对象时,则先执行派生类的析构函数,随后再执行基类的析构函数.,例:class Base public: Base() coutConstructing base classn; Base() coutDestructin

9、g base classn; ;class Derive:public Base public: Derive()coutConstructing derived classn; Derive()coutDestructing derived classn; int main() Derive op; return 0; ,Constructing base classConstructing derived classDestructing derived classDestructing base class,4.2.1 派生类构造函数和析构函数的构造规则,1.简单派生类的构造函数 当基类

10、的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数. 当基类含有带参数的构造函数时,由于派生类不能继承基类的构造函数与析构函数,此时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径.,在C+中派生类构造函数的一般形式为:派生类名(参数总表):基类名(参数表) / 派生类新增数据成员的初始化语句 其中:基类构造函数的参数,通常来源于派生类构造函数的参数总表.也可用常数值.,class Student public: Student(int number1,string name1,float score1) number=number1

11、; name=name1; score=score1; void print() cout “number:”numberendl; cout “name:”nameendl; cout “score:”scoreendl; protected: int number; string name; float score;,class UStudent:public Student public: UStudent(int number1,string name1,float score1,string major1):Student(number1,name1,score1) major=ma

12、jor1; void print1() print(); cout “major:”majorendl; private: string major;,int main() UStudent stu(001,”张三”,95,”信息工程”); stu.print1(); return 0;,说明:(1)可以将派生类的构造函数定义在类的外部,类体内只写该函数的声明. 在类中声明派生类的构造函数时,不包括基类构造函数名及其参数表.只在类外定义构造函数时才将它列出来.,class UStudent:public Student public: UStudent(int number1,string n

13、ame1,float score1,string major1); void print1() print(); cout “major:”majorendl; private: string major;UStudent:UStudent(int number1,string name1,float score1,string major1):Student(number1,name1,major1) major=major1;,(2)如果基类使用默认构造函数或不带参数的构造函数,则在派生类中定义构造函时可以去掉”:基类构造函数名(参数表)”,此时若派生类不需要构造函数,则可不定义派生类的构

14、造函数. 派生类名(参数总表) / 派生类新增数据成员的初始化语句 ,(3)当基类的构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的构造函数哪怕只带一个参数,它所有的派生类都必须定义构造函数,甚至所定义的派生类函数可能为空,仅仅起到参数传递作用.,2.派生类的析构函数 在派生类中可以根据需要定义自己的析构函数,用于对派生类中新增加的成员进行清理工作,基类的清理工作仍然由基类的构造函数负责. 析构函数是无参的函数.,3.含有对象成员的(子对象)的派生类的构造函数 当派生类中含有内嵌的对象成员(子对象)时,其构造函数的一般形式为: 派生类名(参数总表):基类名(参数表0),对象成员名

15、1(参数表1),对象成员名n(参数表n) / 派生类新增数据成员的初始化语句 在定义派生类对象时,构造函数执行顺序 (1)调用基类的构造函数 (2)调用内嵌对象成员的构造函数(内嵌对象成员有多个,执行顺序与在类中的声明顺序一致) (3)调用基类的构造函数 撤消对象时,析构函数的调用顺序与构造函数正好相反,class Base public: Base(int i) x=I; cout “Constructing base classn”; Base() cout “Destructing base classn”; void show() cout xendl; private: int x;

16、class Derived:public Basepublic: Derived(int i):Base(i),d(i) cout “ Constructing derived classn” Derived() cout “Destructing derived classn” private: Base d;,int main() Derived obj(5); obj.show(); return 0;,Constructing base classConstructing base classConstructing derived class5Destructing derived

17、classDestructing base classDestructing base class,4.3 调整基类成员在派生类中的访问属性的其他方法,4.3.1 同名成员 派生类中定义了与基类成员同名的成员,则派生类成员覆盖了基类的同名成员,在派生类中使用这个名字意味着访问在派生类中重新说明的成员. 为了能够使用基类的同名成员,必须采用如下形式: 基类名:成员名,class A public: A(int x1) x=x1; void print() cout “x=“xendl; private: int x;class B:public A public: B(int x1,int y1

18、):A(x1) y=y1 void print() A:print(); cout “y=“yendl; private: int y;,int main() B b(10,20); b.print2(); return 0;,X=10,说明: 在面向对象程序设计中,若要在派生类中对基类继承过来的某些函数功能进行扩充和改造,都可以采用这样覆盖的方法实现.,4.3.2 访问声明 访问声明的方法是把基类的保护成员或公有成员直接写至私有派生类定义式中的同名段中,同时给成员名前加以基类名和作用域标识符:.利用这种方法,该成员就成为派生类的保护成员或公有成员了.,class A public: A(in

19、t x1) x=x1; void print() cout “x=“x; private: int x;class B:private A public: B(int x1,int y1):A(x1) y=y1 void print2() print(); private: int y;,int main() B b(10,20); b.print2(); return 0;,X=10,class A public: A(int x1) x=x1; void print() cout “x=“x; private: int x;class B:private A public: B(int x

20、1,int y1):A(x1) y=y1; A:print; private: int y;,int main() B b(10,20); b.print(); return 0;,X=10,访问声明:把基类公有成员函数print调整为私有派生类的公有成员函数,4.4 多重继承,派生类只有一个基类,称为单继承 当一个派生类有两个或以上的基类时,这种派生方法就叫做多重继承或多重派生,4.4.1 多重继承派生类的声明class 派生类名:继承方式1 基类名1, ,继承方式n 基类名n / 派生类新增的成员,4.4.2 多重继承派生类的构造函数与析构函数 多重继承下派生类构造函数的定义形式与单继承派生类的构造函数相类似.只是n个基类的构造函数之间用逗号分隔. 派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),基类名n(参数表n) / 派生类新增成员的初始化语句 ,多重继承的构造函数执行顺序:(1)先执行基类的构造函数(同一层次的各个基类的执行顺序,取决于声明派生类时指定的各个基类的顺序)(2)执行对象成员的构造函数(含有多个内嵌的对象成员,执行顺序由它们在类中声明的顺序确定)(3)最后执行派生类构造函数,4.5应用举例,例:某计算类由硬件类与软件类派生出,试写出程序段.,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号