《继承和派生》PPT课件.ppt
继承和派生l继承和派生的基本概念l单一继承定义l派生类重定义基类函数l基类中成员被继承后存取权限等级的变化l继承关系中构造函数、析构函数之间的关系l多重继承继承的例子家具和柜子建筑和房子道路和高速公路动物和猫电视和彩色电视电脑和笔记本电脑基类与派生类在原有类的基础上派生出新的类,新类继承原有类的属性和方法,称原有的类为基基类类,新类称为派生类派生类。假定有一个类A,要创建一个新类B,它是类A的一个特殊版本。类A就称为基类,类B则称为派生类。类A是父,类B就是子继承和派生的基本概念继承允许以现有的类为基础来构建新类新类(派生类)继承现有类(基类)的属性和行为派生类可以修改继承的属性和行为派生类可以增加新的属性和行为派生类对象也是基类对象派生类对象和基类对象可以被统一管理继承和派生的基本概念继承的意义便于管理系统中的对象系统扩充比较容易-利用程序代码的再用性加快程序发展的速度减少程序的错误何时使用继承继承使用时机A类是B类的一种A类与B类在属性和功能上相差不多,只是A类多了一些独有的特性此时可以考虑使A类继承于B类派生类的声明单继承派生类的声明语法为:class派生类名:继承方式基类名派生类新增成员的声明;继承要考虑的部分派生类不同于基类的部分派生类扩充基类的部分继承和派生class Pointprivate:int x,y;public:Point(int a,int b)x=a;y=b;void show()coutxyendl;class Rectangle:private Point private:int H,W;public:Rectangle(int a,int b,int h,int w):Point(a,b)H=h;W=w;void show()point:show();coutHWendl;继承和派生私有成员(private):可以被类自身的成员和友元访问,但不能被包括派生类在内的其他任何类和任何普通函数访问 公有成员(public):可以被任何普通函数和任何类的成员函数访问保护成员(protected):可以被类自身的成员和友元访问外,还可以被派生类的成员函数访问,但不能被任何非友元的普通函数访问公有继承(public)和派生基类中公有成员和受保护成员被继承后可见性不变public方式继承成员存取权限等级的变化成员M基类中的存取权限成员M 在public继承后的派生类中的存取权限publicpublicprotectedprotectedprivate隐藏私有继承(private)和派生基类中公有成员和受保护成员被继承后都是私有的private方式继承成员存取权限等级的变化成员M基类中的存取权限成员M 在private继承后的派生类的存取权限publicprivateprotectedprivateprivate隐藏受保护继承(protected)和派生基类中公有成员和受保护成员被继承后都是受保护的成员M基类中的存取权限 成员M 在protected继承后的派生类的存取权限publicprotectedprotectedprotectedprivate隐藏基类中的私有成员基类中的私有成员能被派生类继承不能被派生类的成员函数直接访问可通过定义于基类的公有和受保护成员函数访问派生类重定义基类函数在派生类中重定义基类的函数派生类自动继承基类的所有成员重定义函数的函数原型和基类中被重定义函数的函数原型必须完全相同 不同则是函数重载重定义之后两个函数共存,但调用方法不同调用基类函数:基类名+:+函数名调用派生类函数:直接调用如果派生类中出现相同的成员需要编程时注意其存取的范围.不能运用基类的成员函数来设定派生类的数据成员,而只能在派生类中重新定义存取数据成员的成员函数.继承和派生练习、设计一个圆类,从圆派生圆柱(或圆锥),并设计成员函数输出圆柱(或圆锥)的底面面积和体积。继承关系中构造函数之间的关系派生类不继承基类的构造函数派生类和基类的构造函数之间是一种自动调用的关系创建派生类对象时,派生类构造函数要调用基类的构造函数对基类的数据成员进行初始化先执行基类构造函数,然后执行派生类构造函数体基类构造函数需要参数时需要显式调用,格式:派生类名:派生类名(参数表):基类(参数表)基类构造函数不需要参数时(有默认构造函数),隐式调用继承关系中析构函数之间的关系派生类不继承基类的析构函数派生类和基类的析构函数之间是一种自动调用的关系派生类的析构函数也需要调用基类的析构函数做一些和基类相关的清理工作销毁派生类对象时先执行派生类析构函数,然后执行基类析构函数体继承和派生class People public:People(char*str)name=new charstrlen(str)+1;strcpy(name,str);coutPeople construct:nameendl;People()coutPeople destroy:nameendl;delete name;protected:char*name;继承和派生class Teacher:public People public:Teacher(char*str,char*sch:People(str)/调用基类的构造函数 school=new charstrlen(sch)+1;strcpy(school,sch);coutTeacher construct:name in schoolendl;Teacher:Teacher()coutTeacher destroy:name in schoolendl;delete school;protected:char*school;继承和派生int main()People tmp(Zhang San);People p(Li Si);Teacher t(Wang Wu,Wuhan University);return 0;多重继承类的层次一个类可以是某个继承关系中的基类,也可以是另一个继承关系中的派生类类A派生出类B,类B又派生出类C,则类B是类C的直接基类,类A是类C的间接基类 定义派生类时,直接基类要明确列出,间接基类不用列出 多重继承class Pointprivate:int x,y;public:Point(int a,int b)x=a;y=b;void show()coutxyendl;class Rectangle:public Point private:int H,W;public:Rectangle(int a,int b,int h,int w):Point(a,b)H=h;W=w;void show()point:show();coutHWendl;多重继承class Test:public Rectangle public:Test(int a,int b,int h,int w):Rectangle(a,b,h,w)void show()Rectangle:show();多重继承#include class A public:void func()cout“A.func”endl;class B public:void func()cout“B.func”endl;void gunc()cout“b,gunc”endl;多重继承 class C:public A,public B public:void gunc()cout“c.gunc”endl;void hunc()func();多重继承多重继承中,对基类成员的访问必须是无二义性的。对以上的程序段可进行如下修改:void hunc()A:func();B:func();多重继承下面是某公司经理、兼职人员、销售经理和销售员的工资计算方法,设计合适的基类和派生类,实现工资管理任务。人员类别 固定工资(元)计时工资(元/小时)当月销售总额提成 公司经理 8000 无 无 兼职人员 无 100 无 销售经理 5000 无 5 销售员 无 无 4