第11章继承与派生.ppt
LogoLogoAdd Your Company Slogan第第11章章 继承与派生继承与派生C+程序程序设计本章内容本章内容11.1 11.1 继承与派生的概念继承与派生的概念11.2 11.2 派生类的声明方式派生类的声明方式11.3 11.3 派生类的构成派生类的构成11.4 11.4 派生类成员的访问属性派生类成员的访问属性11.5 11.5 派生类的构造函数和析构函数派生类的构造函数和析构函数11.6 11.6 多重继承多重继承11.7 11.7 基类与派生类的转换基类与派生类的转换11.8 11.8 继承与组合继承与组合11.9 11.9 继承在软件开发中的重要意义继承在软件开发中的重要意义Logo面向对象程序设计有面向对象程序设计有4个主要特点个主要特点:抽象、封装、继承和多态性。抽象、封装、继承和多态性。11.1 继承与派生的概念继承与派生的概念p继承的概念:继承的概念:在已有类的基础上开发出新类的机制。在已有类的基础上开发出新类的机制。已存在的类称为已存在的类称为“基类基类”或或“父类父类”。新建立的类称为新建立的类称为“派生派生类类”或或“子类子类“。p派生的概念:派生的概念:从已有的类从已有的类(父类父类)产生一个新的子类,称为类的产生一个新的子类,称为类的派生。派生。基类与派生类的关系:基类与派生类的关系:派生类是对基类的扩充,基类时派生类派生类是对基类的扩充,基类时派生类的基础。的基础。继承的目的:继承的目的:实现代码重用,实现代码重用,节省重复代码的编写工作。是软节省重复代码的编写工作。是软件重用的基础。件重用的基础。派生的目的:派生的目的:当新的问题出现,原有程序无法解决(或不能完当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。全解决)时,需要对原有程序进行改造。Logo11.1 继承与派生的概念继承与派生的概念在在C+中中,有有两种两种继承方式:继承方式:单一继承单一继承和和多重继承多重继承。单一继承单一继承:一个派生类只从一个父类派生,这称为单继承一个派生类只从一个父类派生,这称为单继承,这这种继承关系所形成的层次是一个树形结构种继承关系所形成的层次是一个树形结构.在校人员类在校人员类学生类学生类职工类职工类(属性:属性:姓名,年龄,身高姓名,年龄,身高)增加增加属性:属性:学号学号 成绩成绩 增加增加属性:属性:部门部门 工资工资 单一继承单一继承Logo11.1 继承与派生的概念继承与派生的概念多重继承多重继承圆柱体类圆柱体类 圆类圆类 柱体类柱体类 组合组合(属性属性:圆心坐标圆心坐标,半径半径)(属性属性:高度高度)属性属性:圆心坐标圆心坐标,半径半径,高度高度多重继承:多重继承:一一个派生类有两个或多个父类的称为多重继承。个派生类有两个或多个父类的称为多重继承。Logo11.2 派生类的声明方式派生类的声明方式单一继承单一继承定义派生类的一般格式:定义派生类的一般格式:class:private:/私有成员说明私有成员说明 .public:/公有成员说明公有成员说明 .protected:/保护成员说明保护成员说明 .;继承方式:继承方式:public 公有继承公有继承(派生派生)private 私有继承私有继承(派生派生)protected 保护继承保护继承(派生派生)Logo假设已经声明了一个基类假设已经声明了一个基类Student,在此基础上通过单继承建在此基础上通过单继承建立一个派生类立一个派生类Student1:class Student public:void display();private:int num;string name;string sex;void Student display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;基基类StudentStudentLogoclass Student1:public Studentpublic:void display_1()/新增加的成员函数新增加的成员函数 coutage:ageendl;coutaddress:addrnumnamesex;numnamesex;void display()void display()coutcout num:num num:numendlendl;coutcout name:name name:nameendlendl;coutcout sex:sex sex:sexendlendl;private:private:/基基类私有成私有成员 intint num;num;string name;string name;char sex;char sex;声明基类声明基类Logoclassclass Student1Student1:publicpublic Student Student /以以publicpublic方式方式声声明派生明派生类Student1Student1 public:public:void display_1()void display_1()coutcout num:num num:numendlendl;/企企图引用基引用基类的私有成的私有成员,错误coutcout name:name name:nameendlendl;/企企图引用基引用基类的私有成的私有成员,错误coutcout sex:sex sex:sexendlendl;/企企图引用基引用基类的私有成的私有成员,错误coutcout age:age age:ageendlendl;/引用派生引用派生类的私有成的私有成员,正确,正确coutcout address:address:addraddrendlendl;/引用派生引用派生类的私有成的私有成员,正确,正确private:private:intint age;age;string string addraddr;声明派生类声明派生类Logo例例11.1 访问公有基类的成员。访问公有基类的成员。可以将派生类可以将派生类Student1的声明改为的声明改为class Student1:public Student public:void display_1()cout age:ageendl;/引用派生类的私有成员,正确引用派生类的私有成员,正确cout address:addrendl;/引用派生类的私有成员,正确引用派生类的私有成员,正确private:int age;string addr;Logo1.1.#include#include 2.2.using namespace std;using namespace std;3.3.class class StudentStudent4.4.public:public:5.5.void void get_valueget_value()()6.6.cincinnumnamesex;numnamesex;7.7.void display()void display()8.8.coutcoutnum:numnum:numendlendl;9.9.coutcoutname:namename:nameendlendl;10.10.coutcoutsex:sexsex:sexageageaddraddr;21.21.void display_1()void display_1()22.22.coutcoutage:ageage:ageendlendl;/引用派生引用派生类的私有成的私有成员,正确。,正确。23.23.coutcoutaddress:address:addraddrendlendl;/引用派生引用派生类的私有成的私有成员,正,正确确24.24.private:private:25.25.intint age;age;26.26.char addr30;char addr30;27.27.;28.28.intint main()main()29.29.Student1Student1 stud1stud1;30.30.stud1stud1.get_value_1()get_value_1();31.31.stud1 stud1.display();display();32.32.stud1stud1.display_1();.display_1();33.33.return 0;return 0;Logo问题:问题:如果在上例中,为如果在上例中,为基类基类Student创建一个创建一个对象对象a,为为派生类派生类Student1创建一个创建一个对象对象b,如何分别输出如何分别输出两个对象的数据值?两个对象的数据值?修改修改 P390第第1题。题。Logo11.4.2 私有继承私有继承 A B class A .;class B:private A /私有继承私有继承A .A 中的:中的:在在 B 中:中:在类外在类外(类类B的对象中的对象中)private 成员成员 不可访问不可访问 不可访问不可访问public成员成员 变为变为 private 成员成员 不可访问不可访问protected成员成员 变为变为 private 成员成员 不可访问不可访问将将 A A 中的中的 public public 和和 protected protected 成员均变成了成员均变成了B B 的的 private private 成员。成员。同理,同理,A A中的私有成员被继承下来了,但在中的私有成员被继承下来了,但在B B中不可直接访问。中不可直接访问。Logo11.4.2 私有继承私有继承Logo11.4.2 私有继承私有继承 例例11.2 将例将例11.1中的公用继承方式改为用私有继中的公用继承方式改为用私有继承方式承方式(基类基类Student不改不改)。私有派生类如下私有派生类如下:class class Student1:Student1:privateprivate Student Student public:public:void display_1()void display_1()/输出两个数据成员的值输出两个数据成员的值 coutcoutage:ageage:ageendlendl;/引用派生类的私有成员,正确引用派生类的私有成员,正确coutcoutaddress:address:addraddrendlendl;/引用派生类的私有成员,正确引用派生类的私有成员,正确private:private:intint age;age;string string addraddr;Logo分析下面的主函数分析下面的主函数:int main()Student1 stud1 stud1.display();/错误,私有基类的公用成员函数在派生类中是私有函数错误,私有基类的公用成员函数在派生类中是私有函数stud1.display_1();/正确。正确。Display_1函数是函数是Student1类的公用函数类的公用函数stud1.age=18;/错误。外界不能引用派生类的私有成员错误。外界不能引用派生类的私有成员return 0;完成完成 P390P390第第2 2题。题。Logo11.4.3 受保护的受保护的继承继承 A B class A.;class B:protected A /保护继承保护继承A.A 中的:中的:在在 B 中:中:在类外在类外(类类B的对象中的对象中)private 成员成员 不可访问不可访问 不可访问不可访问public成员成员 变为变为 protected 成员成员 不可访问不可访问protected成员成员 变为变为 protected成员成员 不可访问不可访问将将 A 中的中的 public 和和 protected 成员均变成了成员均变成了B 的的 protected 成员。成员。同理,同理,A中的私有成员被继承下来了,但在中的私有成员被继承下来了,但在B中不可直接访问,中不可直接访问,Logo例例11.3 在派生类中引用保护成员。在派生类中引用保护成员。#include#include using namespace std;class Student/声明基类声明基类public:/基类公用成员基类公用成员 void display();protected:/基类保护成员基类保护成员int num;string name;char sex;void Student:display()/定义基类成员函数定义基类成员函数 coutnum:numendl;coutname:nameendl;coutsex:sexendl;Logoclass Student1:class Student1:protectedprotected Student Student /用用protectedprotected方式方式声声明派生明派生类Student1Student1 public:public:void display1();void display1();/派生派生类公用成公用成员函函数数private:private:intint age;age;/派生派生类私有私有数数据成据成员string string addraddr;/派生派生类私有私有数数据成据成员;void Student1:display1()void Student1:display1()/定定义派生派生类公用成公用成员函函数数 coutcoutnum:numnum:numendlendl;/引用基引用基类的保的保护成成员,合法,合法 coutcoutname:namename:nameendlendl;/引用基引用基类的保的保护成成员,合法,合法 coutcoutsex:sexsex:sexendlendl;/引用基引用基类的保的保护成成员,合法,合法 coutcoutage:ageage:ageendlendl;/引用派生引用派生类的私有成的私有成员,合法,合法 coutcoutaddress:address:addraddrendlendl;/引用派生引用派生类的私有成的私有成员,合法,合法 Logo分析主函数:分析主函数:int main()Student1 stud1;/stud1是派生类是派生类Student1类的对象类的对象 stud1.display1();/合法,合法,display1是派生类中的公用成员函数是派生类中的公用成员函数 stud1.num=10023;/错误,外界不能访问保护成员错误,外界不能访问保护成员return 0;完成完成 P390P390第第3 3题。题。Logo11.4.4 多级派生时的访问属性多级派生时的访问属性类类A A为基类,类为基类,类B B是类是类A A的派生类,类的派生类,类C C是类是类B B的派生类,则类的派生类,则类C C也是类也是类A A的派的派生类。类生类。类B B称为类称为类A A的直接派生类,类的直接派生类,类C C称为类称为类A A的间接派生类。类的间接派生类。类A A是类是类B B的的直接基类,是类直接基类,是类C C的间接基类。的间接基类。在多在多级派生的情况下,各成员的访问属性级派生的情况下,各成员的访问属性仍按以上原则确定。仍按以上原则确定。Logoclass A /基类基类public:int i;protected:void f2();int j;private:int k;class B:public A /public方式方式public:void f3();protected:void f4();private:int m;例例11.4 11.4 多级派生的访问属性。多级派生的访问属性。Logoclass class C C:protected:protected B B /protected /protected方式方式 public:public:void f5();void f5();private:private:intint n;n;类A A是是类B B的公用基的公用基类,类B B是是类C C的保的保护基基类。各成。各成员在不在不同同类中的中的访问属属性如下性如下:if2jk f3f4 m f5 n基类基类A公用公用 保护保护 保护保护 私有私有公公用用派派生生类类B 公用公用 保护保护 保护保护 不不 可可访问访问 公用公用 保护保护 私有私有 保保护护派派生生类类C 保护保护 保护保护 保护保护 不不 可可访问访问 保护保护 保护保护 不不 可可访问访问 公用公用 私有私有LogoLogoLogoLogoAdd Your Company SloganThank you本章到此结束