•教学目的与要求:了解什么是继承和派生。掌握派生类的创建过程和派生方式•教学内容提要:1、为什么要使用继承;2、单基派生类的声明;3、基类成员在派生类中访问属性4、派生类对基类成员的访问•教学重点:单继承的派生类的定义方式和派生方式•教学难点:单继承的派生类的定义方式和派生方式•教学进度:P111~P123•教学过程:第12讲派生类的概念工具车轿车面包车小汽车卡车旅行车汽车交通工具事物的共性与特性继承是面向对象程序设计支持代码重用的重要机制。C++语言中,通过继承,一个新类可以在原有类的基础上派生而来,新类将共享原有类的属性,并且还可以添加新的特性。【12.1为什么要使用继承】在C++语言中,通过继承,可以让一个类拥有另一个类的全部属性,也即让一个类继承另一个类的全部属性。可以把继承过程看成是从一个类派生出一个新类的过程。在已有类的基础上新增自己的特性而产生新类的过程称为派生。派生出来的新类称为派生类或子类;而被继承的类称作基类或父类。一个基类可以派生出多个派生类,一个派生类也可以由多个基类派生而来。称从一个基类派生出一个派生类的过程为单继承;从多个基类派生出一个派生类的过程为多继承。计算机类台式机类便携式类输入设备类输出设备类外部设备类a)单继承b)多继承图单继承与多继承通过单继承派生一个类的一般形式如下:class派生类名:派生方式基类名{派生类新增加的数据成员和成员函数};是通过单继承派生出来的类的名称。用关键字public、private或protected指定,如果省略,系统将默认为私有派生。指明了这个派生类的基类,这个基类必须在声明这个派生类之前已经声明,否则,会导致编译错误。【12.2单继承的派生类声明】例如:classbaseclass{inta,b;public://公有成员};abbaseclass例如:classsubclass:publicbaseclass{intc;public://公有成员};absubclassc基类部分派生类部分派生方式用的关键字public:表示公有派生private:表示私有派生protected:表示保护派生在声明一个派生类时,采用不同的派生方式,从基类继承而来的成员的访问权限在派生类中也有所不同。从已有类派生出新类时,可以在派生类内完成以下几种功能:(1)可以增加新的数据成员;(2)可以增加新的成员函数;(3)可以重新定义基类中已有的成员函数;(4)可以改变现有成员的属性。当采用公有派生时,基类中的公有(public)成员和保护(protected)成员的访问权限在派生类中保持不变,而基类的私有(private)成员无论是在派生类中,还是在类外都是不可访问的。基类的公有成员和保护成员被派生类继承过来,作为派生类的公有成员和保护成员;但基类的私有成员在派生类中不能直接使用。简述【12.3.1公有派生】【12.3基类成员在派生类中的访问属性】#includeiostream.hclassA{public:voidsetx(inta){x=a;}voidsety(intb){y=b;}intgetx()const{returnx;}intgety()const{returny;}protected:intx;private:inty;};classB:publicA{public:intgetsum(){returnx+gety());}//直接访问从基类继承来的保护成员x;但是基//类的私有成员y,只能通过接口函数访问。};公有派生例12-1voidmain(){Bb;b.setx(2);b.sety(3);cout″X=″b.getx()″\tY=″b.gety()endl;cout″X+Y=″b.getsum()endl;}在公有派生时,基类和派生类中的公有成员都可以直接通过派生类的对象名来访问。一个类的保护成员只能被它自己的成员函数或它的派生类的成员函数访问,在类外不能直接访问。X=2Y=3X+Y=5当采用私有派生时,基类的私有(private)成员与公有派生时相同,无论是在派生类中,还是类外都是不可访问的。但基类中的公有(public)成员和保护(protected)成员的访问权限在派生类中则变为私有。基类的公有成员和保护成员被派生类继承过来,作为派生类的私有成员;而基类的私有成员在派生类中不能直接使用。简述【12.3.2私有派生】#includeiostream.hclassA{public:voidsetx(inta){x=a;}voidsety(intb){y=b;}intgetx()const{returnx;}intgety()const{returny;}protected:intx;private:inty;};classB:privateA{public:voidsetBx(inta){setx(a);}voidsetBy(intb){sety(b);}私有派生说明:类B是由类A私有派生而来的,类A中的公有和保护成员被类B继承过来后,作为私有成员,因此,通过类B的对象名无法直接访问类A中的任一成员。例12-2intgetBx(){returngetx();}intgetBy(){returngety();}intgetsum(){returnx+gety();}};voidmain(){Bb;cout″X=″b.getBx()″\tY=″b.getBy()endl;cout″X+Y=″b.getsum()endl;}X=2Y=3X+Y=5(续)b.setBx(2);b.setBy(3);b.setx(2);//errorb.sety(3);//error例12-3保护派生#includeiostream.hclassA{public:voidsetx(inta){x=a;}voidsety(intb){y=b;}intgetx()const{returnx;}intgety()const{returny;}当采用保护派生时,基类的私有(private)成员与公有派生时相同,无论是在派生类中,还是类外都是不可访问的。但基类中的公有(public)成员和保护(protected)成员的访问权限在派生类中则变为保护。基类的公有成员和保护成员被派生类继承过来,作为派生类的保护成员;而基类的私有成员在派生类中不能直接使用。简述【12.3.3保护派生】protected:intx;private:inty;};classB:protectedA{public:voidsetBx(inta){setx(a);}voidsetBy(intb){sety(b);}intgetBx(){returngetx();}intgetBy(){returngety();}intgetsum(){returnx+gety();}};voidmain(){Bb;b.setBx(2);例12-3保护派生b.setBy(3);cout″X=″b.getBx()″\tY=″b.getBy()endl;cout″X+Y=″b.getsum()endl;}引入保护成员的意义在于使类中的这些成员对该类及它的派生类是可见的,但在程序的其他部分与私有成员一样,是不可见的。X=2Y=3X+Y=5(续)派生类型基类成员特性派生类成员特性公有(public)公有(public)保护(protected)保护私有(private)不可访问公有(public)私有(private)保护(protected)私有(private)私有(private)不可访问公有(public)保护(protected)保护(protected)保护公有派生(public)私有派生(private)保护派生(protected)私有(private)不可访问表不同派生类型中相应基类及派生类的访问特性派生类对基类成员的访问形式主要有以下两种:(1)内部访问:由派生类中新增成员对基类继承来的成员的访问。(2)对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。【12.4派生类对基类成员的访问规则】1.私有继承的访问规则当类的继承方式为私有继承时,基类的public成员和protected成员被继承后作为派生类的private成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问。教材4.1一个私有继承的例子2.公有继承的访问规则当类的继承方式为公有继承时,基类的public成员和protected成员被继承到派生类中仍作为派生类的public成员和protected成员,派生类的其他成员可以直接访问它们。但是,类的外部使用者只能通过派生类的对象访问继承来的public成员。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问从基类继承来的private成员,但是可以通过基类提供的public成员函数间接访问它们。教材例4.3公有继承的访问规则表私有继承的访问规则基类成员private成员public成员protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问3.保护继承的访问规则当类的继承方式为保护继承时,基类的public成员和protected成员被继承到派生类中都作为派生类的protected成员,派生类的其他成员可以直接访问它们,但是类的外部使用者不能通过派生类的对象来访问它们。基类的private成员在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的private成员。教材例4.4保护继承的访问规则。表公有继承的访问规则基类成员Private成员public成员protected成员内部访问对象访问不可访问不可访问可访问可访问可访问不可访问在程序的任何部分如果声明有一个类的对象,就可以通过这个对象访问对象所属类中的所有公有成员,但不能访问其私有和保护成员;而一个派生类的函数成员则可以访问所属类中的新声明的所有成员,以及派生它的基类中的公有和保护成员。一个类的私有成员只能被所属类的成员函数访问,在其他任何地方都不可见。注表保护继承的访问规则基类成员private成员public成员protected成员内部访问对象访问不可访问不可访问可访问不可访问可访问不可访问小结1、派生类的声明格式2、三种不同的派生方式3、派生类对基类成员的访问规则作业:P188:4.14.2