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

上传人:飞****2 文档编号:27867836 上传时间:2022-07-26 格式:PPT 页数:42 大小:182.50KB
返回 下载 相关 举报
C++-派生类与继承ppt课件.ppt_第1页
第1页 / 共42页
C++-派生类与继承ppt课件.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《C++-派生类与继承ppt课件.ppt》由会员分享,可在线阅读,更多相关《C++-派生类与继承ppt课件.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第4章章 派生类与继承派生类与继承继承继承在已有类的基础上建立一个新类的过程称为在已有类的基础上建立一个新类的过程称为继承继承被继承的已有类称为被继承的已有类称为基类基类(父类)(父类)派生派生在已有类的基础上在已有类的基础上新增新增自己的特性自己的特性( (属性与属性与行为行为) )而产生新类的过程称为派生而产生新类的过程称为派生派生出的新类称为派生出的新类称为派生类派生类(子类)(子类)继承与派生的目的:实现代码的重用与扩充继承与派生的目的:实现代码的重用与扩充4.1派生类的概念派生类的概念4.1.14.1.1继承继承单继承单继承派生类只从一个基类派生派生类只从一个基类派生多重继承多重继

2、承一个派生类有两个或多个基类一个派生类有两个或多个基类多级派生(多层派生)多级派生(多层派生)派生类又作为基类,继续派生新的类派生类又作为基类,继续派生新的类4.1.24.1.2派生类的声明派生类的声明class class 派生类名派生类名:继承方式继承方式 基类名基类名 / /派生类新增的数据成员和成员函数派生类新增的数据成员和成员函数; 继承方式继承方式: :规定了如何访问从基类继承的成员规定了如何访问从基类继承的成员, ,可以是可以是private,protected,publicprivate,protected,public三种方三种方式式. ./定义一个基类定义一个基类class

3、 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

4、:private person / ; (3) 保护继承保护继承 class employee:protected person / ; 4.1.34.1.3派生类的构成派生类的构成 派生类除了可以从基类继承成员外派生类除了可以从基类继承成员外, ,还可以还可以增加自己的数增加自己的数据成员和成员函数据成员和成员函数. .这些新增的成员正是派生类不同于基这些新增的成员正是派生类不同于基类的类的关键关键所在所在, ,是派生类对基类的发展是派生类对基类的发展. .Person类string name;int age;char sex;void print();Employee类string nam

5、e;int age;char sex;void print()继承继承 新增新增(发展发展)string department;float salary;void print1();继承与派生的目的:实现代码的重用与扩充继承与派生的目的:实现代码的重用与扩充构造一个派生类一般过程构造一个派生类一般过程: :(1)(1)派生类从基类接收成员派生类从基类接收成员 C+C+继承中继承中, ,派生类把基类的全部成员派生类把基类的全部成员( (构造函构造函数与析构函数除外数与析构函数除外) )接收过来接收过来. .(2)(2)调整从基类接收来的成员调整从基类接收来的成员(3)(3)在派生类中增加新成员在

6、派生类中增加新成员. .4.1.44.1.4基类成员在派生类中的访问属性基类成员在派生类中的访问属性 派生类继承基类中全体成员派生类继承基类中全体成员( (除了构造函数与析构除了构造函数与析构函数函数).).这些成员的访问属性在派生程中可以调整这些成员的访问属性在派生程中可以调整. . 从基类继承来的成员在派生类的访问属性是由继从基类继承来的成员在派生类的访问属性是由继承方式控制承方式控制. . class class 派生类名派生类名: : 继承方式继承方式 基类名基类名 / / . . 继承方式为继承方式为public,protected,privatepublic,protected,p

7、rivate. .不同的不同的继承方式继承方式, ,导致不同访问属性的基类成员在派生类导致不同访问属性的基类成员在派生类的访问属性有所不同的访问属性有所不同. . 用公有继承方式建立的派生类称为用公有继承方式建立的派生类称为公有派生类公有派生类 用私有继承方式建立的派生类称为用私有继承方式建立的派生类称为私有派生类私有派生类 用保护继承方式建立的派生类称为用保护继承方式建立的派生类称为保护派生类保护派生类基类中的成员基类中的成员在公有派生类在公有派生类中的访问属性中的访问属性在私有派生类在私有派生类中的访问属性中的访问属性在保护派生类在保护派生类中的访问属性中的访问属性私有成员私有成员公有成员

8、公有成员保护成员保护成员不可直接访问不可直接访问公有公有保护保护不可直接访问不可直接访问私有私有私有私有不可直接访问不可直接访问保护保护保护保护表表:基类成员在派生类中的访问属性基类成员在派生类中的访问属性4.1.5 4.1.5 派生类对基类成员的访问规则派生类对基类成员的访问规则 类的继承方式有类的继承方式有 public(public(公有继承公有继承) ) protected( protected(保护继承保护继承) ) private( private(私有继承私有继承) ) 不同的继承方式导致原来具有不同访问属性的基类成员不同的继承方式导致原来具有不同访问属性的基类成员在派生类中的访

9、问属性不同在派生类中的访问属性不同. . 派生类对基类成员的访问形式有以下两种派生类对基类成员的访问形式有以下两种: : (1) (1)内部访问内部访问, ,派生类的新增成员函数对基类继承的成员派生类的新增成员函数对基类继承的成员的访问的访问 (2)(2)对象访问对象访问, ,在派生类的外部在派生类的外部, ,以派生类的对象对基类以派生类的对象对基类继承来的成员的访问继承来的成员的访问. .1.1.私有继承的访问规则私有继承的访问规则 基类成员基类成员private成员成员public成员成员protected成员成员内部访问内部访问对象访问对象访问 不可访问不可访问不可访问不可访问可访问可访

10、问不可访问不可访问可访问可访问不可访问不可访问基类中的基类中的private成员成员,既不能被派生类的对象访问既不能被派生类的对象访问, 也不能被也不能被派生类的新增成员函数访问派生类的新增成员函数访问(内部访问内部访问).class Base public: void setx(int n) x=n; void showx() cout xendl; private: int x;class Derived: private Base public: void setxy(ini n,int m) setx(n); y=m; void showxy(); cout x; coutyendl

11、private: int y;int main() Derived obj; obj.setx(10); obj.showx(); obj.setxy(20,30); obj.showxy(); return 0;2.2.公有继承的访问规则公有继承的访问规则 基类成员基类成员private成员成员public成员成员protected成员成员 内部访问内部访问 对象访问对象访问 不可访问不可访问不可访问不可访问 可访问可访问 可访问可访问可访问可访问不可访问不可访问class Base public: void setxy(int m,int n) x=m; y=n; void showxy(

12、) cout x y endl; private: int x; protected: int y; 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.3.保护继承的访问规则保护继承的

13、访问规则 基类成员基类成员private成员成员public成员成员protected成员成员内部访问内部访问 对象访问对象访问 不可访问不可访问不可访问不可访问可访问可访问不可访问不可访问可访问可访问不可访问不可访问4.24.2派生类的构造函数与析构函数派生类的构造函数与析构函数 派生类继承了基类的成员派生类继承了基类的成员, ,实现了代码的重用实现了代码的重用, ,引引入继承更主要的目的是代码的扩充入继承更主要的目的是代码的扩充. .所以所以, ,只有在只有在派生类中加入新成员派生类中加入新成员, ,派生才更有实际意义派生才更有实际意义. . 派生类不能继承基类的构造函数派生类不能继承基类

14、的构造函数, ,在派生类中对新在派生类中对新增成员的初始化增成员的初始化, ,加入派生类的构造函数加入派生类的构造函数, ,基类继基类继承下来的成员初始化有基类构造函数完成承下来的成员初始化有基类构造函数完成. . 同样同样, ,当搞清对象时当搞清对象时, ,也需要加入派生类的析构函也需要加入派生类的析构函数来执行清理工作数来执行清理工作. .4.2.1 4.2.1 派生类构造函数和析构函数的执行顺序派生类构造函数和析构函数的执行顺序 当创建派生类对象时当创建派生类对象时, ,首先执行基类的构造函数首先执行基类的构造函数, ,随后再执行派生类的构造函数随后再执行派生类的构造函数; ;当撤消派生

15、类的对当撤消派生类的对象时象时, ,则先执行派生类的析构函数则先执行派生类的析构函数, ,随后再执行基随后再执行基类的析构函数类的析构函数. .例例:class Base public: Base() coutConstructing base classn; Base() coutDestructing base classn; ;class Derive:public Base public: Derive()coutConstructing derived classn; Derive()coutDestructing derived classn; int main() Derive

16、op; return 0; Constructing base classConstructing derived classDestructing derived classDestructing base class4.2.1 4.2.1 派生类构造函数和析构函数的构造规则派生类构造函数和析构函数的构造规则1.1.简单派生类的构造函数简单派生类的构造函数 当基类的构造函数没有参数当基类的构造函数没有参数, ,或没有显示定义构造或没有显示定义构造函数时函数时, ,派生类可以不向基类传递参数派生类可以不向基类传递参数, ,甚至可以甚至可以不定义构造函数不定义构造函数. . 当基类含有带参数的构

17、造函数时当基类含有带参数的构造函数时, ,由于派生类不能由于派生类不能继承基类的构造函数与析构函数继承基类的构造函数与析构函数, ,此时此时, ,派生类必派生类必须定义构造函数须定义构造函数, ,以提供把参数传递给基类构造函以提供把参数传递给基类构造函数的途径数的途径. .在在C+C+中派生类构造函数的一般形式为中派生类构造函数的一般形式为: :派生类名派生类名( (参数总表参数总表):):基类名基类名( (参数表参数表) ) / 派生类新增数据成员的初始化语句派生类新增数据成员的初始化语句 其中其中: :基类构造函数的参数基类构造函数的参数, ,通常来源于派生类构通常来源于派生类构造函数的参

18、数总表造函数的参数总表. .也可用常数值也可用常数值. .class Student public: Student(int number1,string name1,float score1) number=number1; 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 Stude

19、nt public: UStudent(int number1,string name1,float score1,string major1):Student(number1,name1,score1) major=major1; void print1() print(); cout “major:”majorendl; private: string major;int main() UStudent stu(001,”张三张三”,95,”信息工程信息工程”); stu.print1(); return 0;说明说明: :(1)(1)可以将派生类的构造函数定义在可以将派生类的构造函数定义

20、在类的外部类的外部, ,类体内只写该类体内只写该函数的声明函数的声明. . 在类中声明派生类的构造函数时在类中声明派生类的构造函数时, ,不包括基不包括基类构造函数名及其参数表类构造函数名及其参数表. .只在类外定义构造函数时才将只在类外定义构造函数时才将它列出来它列出来. .class UStudent:public Student public: UStudent(int number1,string name1,float score1,string major1); void print1() print(); cout “major:”majorendl; private: stri

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

22、派生类名派生类名( (参数总表参数总表) ) / 派生类新增数据成员的初始化语句派生类新增数据成员的初始化语句 (3)(3)当基类的构造函数不带参数时当基类的构造函数不带参数时, ,派生类不一定需派生类不一定需要定义构造函数要定义构造函数, ,然而当基类的构造函数哪怕只带然而当基类的构造函数哪怕只带一个参数一个参数, ,它所有的派生类都必须定义构造函数它所有的派生类都必须定义构造函数, ,甚至所定义的派生类函数可能为空甚至所定义的派生类函数可能为空, ,仅仅起到仅仅起到参数参数传递作用传递作用. .2.2.派生类的析构函数派生类的析构函数 在派生类中可以根据需要定义自己的析构函数在派生类中可以

23、根据需要定义自己的析构函数, ,用用于对派生类中新增加的成员进行清理工作于对派生类中新增加的成员进行清理工作, ,基类的基类的清理工作仍然由基类的构造函数负责清理工作仍然由基类的构造函数负责. . 析构函数是无参的函数析构函数是无参的函数. .3.3.含有对象成员的含有对象成员的( (子对象子对象) )的派生类的构造函数的派生类的构造函数 当派生类中含有内嵌的对象成员当派生类中含有内嵌的对象成员( (子对象子对象) )时时, ,其其构造函数的一般形式为构造函数的一般形式为: : 派生类名派生类名( (参数总表参数总表):):基类名基类名( (参数表参数表0),0),对象成对象成员名员名1(1(

24、参数表参数表1),1), ,对象成员名对象成员名n(n(参数表参数表n)n) / / 派生类新增数据成员的初始化语句派生类新增数据成员的初始化语句 在定义派生类对象时在定义派生类对象时, ,构造函数执行顺序构造函数执行顺序 (1)(1)调用基类的构造函数调用基类的构造函数 (2)(2)调用内嵌对象成员的构造函数调用内嵌对象成员的构造函数( (内嵌对象成员内嵌对象成员有多个有多个, ,执行顺序与在类中的声明顺序一致执行顺序与在类中的声明顺序一致) ) (3) (3)调用基类的构造函数调用基类的构造函数 撤消对象时撤消对象时, ,析构函数的调用顺序与构造函数正好析构函数的调用顺序与构造函数正好相反

25、相反class Base public: Base(int i) x=I; cout “Constructing base classn”; Base() cout “Destructing base classn”; void show() cout xendl; private: int x;class Derived:public Basepublic: Derived(int i):Base(i),d(i) cout “ Constructing derived classn” Derived() cout “Destructing derived classn” private: B

26、ase d;int main() Derived obj(5); obj.show(); return 0;Constructing base classConstructing base classConstructing derived class5Destructing derived classDestructing base classDestructing base class4.3 调整基类成员在派生类中的访问属调整基类成员在派生类中的访问属性的其他方法性的其他方法4.3.1 4.3.1 同名成员同名成员 派生类中定义了与基类成员派生类中定义了与基类成员同名的成员同名的成员, ,

27、则派生类则派生类成员成员覆盖覆盖了基类的同名成员了基类的同名成员, ,在派生类中使用这个在派生类中使用这个名字意味着访问在派生类中重新说明的成员名字意味着访问在派生类中重新说明的成员. . 为了能够使用基类的同名成员为了能够使用基类的同名成员, ,必须采用如下形式必须采用如下形式: : 基类名基类名:成员名成员名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):A(x1) y=y1 void print() A

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

29、定义式中的同名段中, ,同时给同时给成员名前加以基类名和作用域标识符成员名前加以基类名和作用域标识符:.:.利用这种利用这种方法方法, ,该成员就成为派生类的保护成员或公有成员该成员就成为派生类的保护成员或公有成员了了. .class A public: A(int 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

30、.print2(); return 0;X=10class A public: A(int 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; A:print; private: int y;int main() B b(10,20); b.print(); return 0;X=10访问声明:把基类公有成员函数print调整为私有派生类的公有成员函数4.4 多重继承多重继承 派生类只有一个基类派生类只有一个基类, ,称为称为单继承单继承

31、 当一个派生类有两个当一个派生类有两个或以上的基类时或以上的基类时, ,这种这种派生方法就叫做派生方法就叫做多重多重继承或多重派生继承或多重派生4.4.1 4.4.1 多重继承派生类的声明多重继承派生类的声明class class 派生类名派生类名: :继承方式继承方式1 1 基类名基类名1, 1, , ,继承方式继承方式n n 基类名基类名n n / 派生类新增的成员派生类新增的成员 4.4.2 4.4.2 多重继承派生类的构造函数与析构函数多重继承派生类的构造函数与析构函数 多重继承下派生类构造函数的定义形式与单继承派多重继承下派生类构造函数的定义形式与单继承派生类的构造函数相类似生类的构

32、造函数相类似. .只是只是n n个基类的构造函数之个基类的构造函数之间用逗号分隔间用逗号分隔. . 派生类名派生类名( (参数总表参数总表):):基类名基类名1(1(参数表参数表1),1),基类名基类名2(2(参数表参数表2),2), ,基类名基类名n(n(参数表参数表n)n) / / 派生类新增成员的初始化语句派生类新增成员的初始化语句 多重继承的构造函数执行顺序多重继承的构造函数执行顺序: :(1)(1)先执行基类的构造函数先执行基类的构造函数( (同一层次的各个基类的同一层次的各个基类的执行顺序执行顺序, ,取决于声明派生类时指定的各个基类的取决于声明派生类时指定的各个基类的顺序顺序) )(2)(2)执行对象成员的构造函数执行对象成员的构造函数( (含有多个内嵌的对象含有多个内嵌的对象成员成员, ,执行顺序由它们在类中声明的顺序确定执行顺序由它们在类中声明的顺序确定) )(3)(3)最后执行派生类构造函数最后执行派生类构造函数4.5应用举例应用举例例例: :某计算类由硬件类与软件类派生出某计算类由硬件类与软件类派生出, ,试写出程序试写出程序段段. .

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁