C++课件第十一章继承和派生类

上传人:ren****ao 文档编号:252988140 上传时间:2024-11-27 格式:PPT 页数:40 大小:344.50KB
返回 下载 相关 举报
C++课件第十一章继承和派生类_第1页
第1页 / 共40页
C++课件第十一章继承和派生类_第2页
第2页 / 共40页
C++课件第十一章继承和派生类_第3页
第3页 / 共40页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第十一章 继承和派生类,类是一种抽象数据类型,是对具有共同属性和行为的对象(事物)的抽象描述。,房屋,平房,楼房,办公楼,居民楼,顶层的抽象事物具有处于底层的抽象事物的共同特,征,而处于底层的抽象事物除了包含顶层抽象事物的,特征外,还具有自身的我特征。,一个类继承另一个类时,这个类被称为继承类、派生类或子类,另一个类被称为被继承类、基类或父类。,继承类包含了被继承类中的所有成员,且有自己的成员。,继承,:,从一个或多个先前定义过的类(称为基类)中接受全部或一部分数据(属性)或函数(行为或操作),并且补充定义新的数据或函数,因而形成一个新的低层的类(称为派生类)。而该派生类还可用作更低层派生类的基类。,class demo,protected:,int j;,public:,demo()j=0,void add(int i)j+=i;,void display(),coutjendl;;,1 派生类定义的格式,class child:,public,demo,public:,void sub(int i)j-=i;,;,void main(void)child object,object1;object.display();object.add(10);object.display();object.sub(5);object.display();object1.display;,0,10,5,0,定义派生类的基本格式:,class,派生类名:继承权限,基类名,继承权限:,public,protected,private,影响的是被继承的原基类成员的访问权限,class,定义的默认为,private,struct,定义的默认为,public,继承权限为public时,,称该派生为,公有派生。,基类中的所有,public成员在派生类中仍是public成员,所有protected成员在派生类中仍是protected成员。,继承权限为private时,,称该派生为,私有派生。,基类中的,public成员和protected成员在派生类中均变成private成员。,继承权限为protected时,,称该派生为,保护派生。,基类中的,public成员和protected成员在派生类中均变成protected成员。,成员,被其它函数访问,被继承,public,可以,可以,protected,不可以,可以,private,不可以,不可以,无论哪一种继承权限,其基类的,private成员均不能为派生类所继承。但可通过被同时继承下来的原基类的某些函数间接访问它们。,private:aa1,protected:aa2,public:aa3,A,Class B:public A,private:bb1,protected:bb2,public:bb3,private:bb1,protected:,aa2,bb2,public:,aa3,bb3,B,公有派生,private:aa1,protected:aa2,public:aa3,A,Class B:protected A,private:bb1,protected:bb2,public:bb3,private:bb1,protected:,aa2,bb2,aa3,public:bb3,B,保护派生,private:aa1,protected:aa2,public:aa3,A,Class B:A,private:bb1,protected:bb2,public:bb3,private:bb1,aa2,aa3,protected:bb2,public:bb3,B,私有派生,2 派生类的使用,#include,class employee,private:,char *name;,short age;,float salary;,public:,employee()name=0;age=0;salary=0.0;,employee(char*name1,short age1,float salary1),name=new charstrlen(name1)+1;,strcpy(name,name1);,age=age1;,salary=salary1;,void print()const,/const成员函数:不能改变类中成 员数据的值,也不能调用类中非 const成员函数,cout“name:”name;,cout“age:”age;,cout“salary:”salaryendl;,employee()delete name;,;,Manager:,除具有employee的属性外,有新的属性。为避免重复定义,可从employee中派生出manager(派生类)。,class manager:public employee,private:,int level;,public:,manager(),level=0;,manager(char*name1,short age1,float salary1,int level1):employee(name1,age1,salary1),level=level1;,void print_level(),cout“level:”levelendl;,;,派生类构造函数:使用初始化符表初始化基类中的成员。,缺省构造函数若基类无缺省构造函数,将出错,基类定义部分,构造函数,析构函数,print,Print_level,name,age,salary,level,函数,函数,函数,派生类新增部分,公有方法,私有成员,void main()manager m(“xyz,24,1000,2);m.print_level();m.print();m.employee:print();,void main()manager n;n.print_level();n.print();,若a是Y从X类中继承来的公用成员,设y是Y的一个对象,,则可访问y.a或y.X:a,protected 访问指明符:外部函数不能访问;派生类成员函数可直接访问。,class employee,private:,short age;,float salary;,protected:,char *name;,/,;,派生类成员函数:,void manager:print_name()const,coutnameendl;,外部函数:,void f(),manager m;coutm.nameendl;,/错,继续派生:,class director:public manager,/,employee,director,manager,多层继承,class x,protected:,int i,j;,public:,x(int i,int j)x:i=i,x:j=j;,void,print,()cout i=i j=j endl;,class y:public x,int k;,public:,y(int i,int j),:x(i,j),k=i*j;,/,初始化列表,void,print,()cout i=i j=j k=kendl;,;,支配规则(就近原则),class z:public y,public:,z(int i,int j):,y(i,j),/,初始化列表,void print1()cout i=i j=jendl;,void,print,()y:print();,;,void main(),y y1(23,45);,y1.print();,y1.x:print();,z z1(10,20);,z1.print();,z1.print1();,z1.y:print();,z1.x:print();,i=23 j=45 k=1035,i=23 j=45,i=10 j=20 k=200,i=10 j=20,i=10 j=20 k=200,i=10 j=20,对属于基类的成员进行初始化是通过初始表中的初始化项来初始化的。若初始化表中没有调用基类的初始化项,则自动调用基类的无参构造函数进行初始化。,如果派生类的自有成员和继承成员同名,则自有成员优先,即通过这个共同的成员名所访问的是自有成员,而不是继承成员,这种情况下,可以在成员名前加类区分符将同名成员区分开。(,支配规则,),作用域运算符不能连续使用,即下列形式是不允许的:CName1:Cname2:Cnamen,作用域运算符的左操作数可以是当前对象的直接基类,也可以是当前对象的间接基类(祖先类)。,3 多重继承与冲突,由多个基类派生出一个子类称之为,多重继承,在多重派生中,如果不同的基类具有名字相同的共有成员或保护成员,此时若在派生类中不正确使用它们,就会产生二义性,这种情况称之为,冲突,在职研究生,研究生,教职工,【例】冲突的程序示例。,class A protected:,int x,;public:A(int a)x=a;,void Show,(void)coutx=xn;,class B protected:,int x,;public:B(int a)x=a;,void Show,(void)coutx=xn;,class C:public A,public B,/多重继承,int y;public:,C(int a,int b):A(a),B(b),/多重继承的初始化,/void Setx(int a)/x=a;,/冲突,A:x=a,;,/正确(冲突的解决办法:在成员名 前加上基类名),void Sety(int b)y=b;int Gety(void)return y;,;,void main(void),C c1(10,100);,/c1.Show();,/冲突,c1.B:Show(),;,/正确,类B1,类B2,类D1,类D2,类C,class B1 protected:,int x,;public:,void Show(),coutx=xn;,class B2 protected:,int x,;public:,void Show(),coutx=xn;,class D1:public B1 ;class D2:public B2 ;,class C:public D2,public D1 public:/void Setx1(int a)D1:B1:x=a;,/错误,域运算 符不能连续使用,void Setx1(int a)D1:x=a;,/正确,或为B1:x=a;,void Setx2(int a)D2:x=a;,/正确,或为B2:x=a;,;,void main(void)C c;c.Setx1(2);/c.D1:B1:Show();,/错误,域运算符不能连续使用,c.SetX2(3);c.D2:Show();,/正确,或为c.B2:Show();,4 构造、析构函数的调用顺序,构造函数的调用顺序只与派生类继承基类的顺序有关,而与初始化成员列表中构造函数顺序无关。,一个类的构造函数只能对它的直接基类的构造函数传递实参,。,编译器调用构造函数的次序:,基类 成员对象 派生类,编译器调用析构函数的次序:,基类 成员对象 派生类,派生类所不能继承的:,友员关系,用户定义的赋值运算符,析构函数,构造函数,运算,用户定义的,new,5,访问类型的调整,有时为了某种目的,需要将从派生类继承的内容的访问类型进行调整,这时可以通过访问声明进行。,访问声明,的一般格式为:,:;,其中,,必须基类的,public,和,protected,类型的成员名。,在访问声明时仅仅说明基类成员名,即对成员数据不可以为它说明数据类型,对成员函数不可以说明参数和返回值类型。,【例】用访问声明调整访问类型,class Cbaseint x;protected:int y;public:int Fun(int a,int b)return a;,class
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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