欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C++中的继承与派生ppt课件.ppt

    • 资源ID:2002326       资源大小:1.59MB        全文页数:107页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C++中的继承与派生ppt课件.ppt

    ,C+程序设计,第4讲 继承与派生 参见教材第8章,本章重点:理解继承对于处理复杂性和实现代码重用的意义。继承和派生的概念 -从已有的类派生出新的类。如何实现继承。,第4讲 继承与派生,4.1 继承与派生的概念继承性是面向对象程序设计中最重要的机制。这种机制提供了无限重复利用程序资源的一种途径。通过C+语言中的继承机制,可以扩充和完善旧的程序设计以适应新的需求。这样不仅可以节省程序开发的时间和资源,并且为未来程序增添了新的资源。,class Student int num; char name30; char sex; public: void display( ) /对成员函数display的定义 coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;,class Studend1 int num; /此行原来己有 char name20; /此行原来己有 char sex; /此行原来己有 int age; char addr20; public: void display( ) ; /此行原来己有 coutnum: numendl; /此行原来己有 coutname: nameendl;/此行原来己有 coutsex: sexendl; /此行原来己有 coutage: ageendl; coutaddress: addrendl; ;,利用原来定义的类Student作为基础,再加上新的内容即可,以减少重复的工作量。 C+提供的继承机制就是为了解决这个问题。在C+中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类(base class)”或“父类(father class)”。新建立的类称为“派生类(derived class)”或“子类(son class)”。,一个新类从已有的类那里获得其已有特性称为类的继承,从已有的类(父类)产生一个新的子类称为类的派生。 在C+语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。,人类: 姓名、性别、年龄、身高、体重教师类: 姓名、性别、年龄、身高、体重、专业、职称管理人员类: 姓名、性别、年龄、身高、体重、职务教师管理人员类: 姓名、性别、年龄、身高、体重、专业、职称、职务学生类: 姓名、性别、年龄、身高、体重、学号、班级、专业,多继承:派生类有多个基类,单继承:派生类只有一个基类,直接基类,间接基类,4.2 派生类的声明与实现class Student1: public Student/声明基类是Studentprivate: int age; /新增加的数据成员 string addr; /新增加的数据成员public: void display_1( ) /新增加的成员函数 coutage: ageendl; coutaddress: addrendl; ;,从一个基类派生一个类的一般格式为:class ClassName:BaseClassName private: .; /私有成员说明 public: .; /公有成员说明 protected: .; /保护成员说明 ,派生类名,基类名,继承方式,派生类中新增加的成员,类A派生类B:类A为基类,类B为派生类。,A,B,但派生并不是简单的扩充,有可能改变基类的性质。,有三种派生方式:公有派生、保护派生、私有派生。,class B:public A.;,class B:protected A.;,class B:private A.;,默认的是私有派生。,class B: A .;,A为私有派生,在建立派生类的过程中,基类不会做任何改变。派生类则除了继承基类的所有可引用的成员变量和成员函数外,还可另外定义本身的成员变量和处理这些变量的函数。由于派生类可继承基类的成员变量和成员函数,因此在基类中定义好的数据和函数等的程序代码可重复使用。,4.3 派生类的构成类A派生类B:类A为基类,类B为派生类。,从基类接收成员(不包括构造函数和析构函数),调整从基类接收的成员,声明派生类时增加的成员,当从已有的类中派生出新的类时,可以对派生类做以下几种变化:1、可以继承基类的成员数据或成员函数。2、可以重新定义已有的成员函数。3、可以改变现有的成员访问属性。 4、可以增加新的成员变量。5、可以增加新的成员函数。,4.4 派生类成员的访问属性,类成员的访问权限:私有成员(private):可以被类自身的成员和友元访问,但不能被包括派生类在内的其他任何类和任何普通函数访问 公有成员(public):可以被任何普通函数和任何类的成员函数访问保护成员(protected):可以被类自身的成员和友元访问外,还可以被派生类的成员函数访问,但不能被任何非友元的普通函数访问 类的三种继承方式:公有继承(public):保护继承(protected):私有继承(private):,常使用如下三种关键字给予表示:1. 公有继承(public) 基类的私有成员不能被派生类的函数成员访问 基类的公有成员和保护成员在派生类中的访问权限不变2. 私有继承(private) 基类的私有成员不能被派生类的函数成员访问 基类的公有成员和保护成员在派生类中的访问权限变为私有类型3. 保护继承(protected) 基类的私有成员不能被派生类的函数成员访问 基类的公有成员和保护成员在派生类中的访问权限变为保护类型,类的继承访问特性,4.4.1 公用继承class ClassName: public BaseClassName公有派生时,基类中所有成员在派生类中保持各个成员的访问权限。,公有派生,派生类中保持基类的成员特性,A,B,public,x在类B新增加的成员中不能直接调用,y在类B中可以调用,z在整个文件中可以调用,例4.1 访问公有基类的成员,#include #include using namespace std;class Studentpublic: void get_value() cinnumnamesex; void display( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; private : int num; string name; char sex;,class Student1: public Student public: void get_value_1() cinageaddr; void display_1() /coutnum: numendl; /企图引用基类的私有成员,错误 /coutname: nameendl; /企图引用基类的私有成员,错误 /coutsex: sexendl; /企图引用基类的私有成员,错误 coutage: ageendl; /引用派生类的私有成员,正确 coutaddress: addrendl; /引用派生类的私有成员,正确 private: int age; string addr; ;,int main() Student1 stud1; stud1.get_value(); stud1.get_value_1(); stud1.display(); stud1.display_1(); return 0;,4.4.2 私有继承class ClassName: private BaseClassName私有派生时,基类中公有成员和保护成员在派生类中均变为私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。,私有派生,派生类中基类公有和保护成员成为私有,基类:public: (变为私有)在派生类中使用,类外不可使用protected: (变为私有)在派生类中使用,类外不可使用private: 不能在派生类中和类外使用,A,B,private,x在类B新增加的成员中不能直接调用,y在类B中可以调用,z在类B中可以调用,均为私有类B 外不能引用,例4.2 私有继承,class Student1: private Student public: void display_1() coutage: ageendl; /引用派生类的私有成员,正确 coutaddress: addrendl; /引用派生类的私有成员,正确 private: int age; string addr; ;,int main() Student1 stud1; stud1.display(); stud1.display_1(); stud1.age18; return 0;,例4.2 私有继承,class Student1: private Student public: void display_1() display(); coutage: ageendl; /引用派生类的私有成员,正确 coutaddress: addrendl; /引用派生类的私有成员,正确 private: int age; string addr; ;,int main() Student1 stud1; stud1.display_1(); return 0;,4.4.3 保护继承class ClassName: protected BaseClassName保护派生时,基类中公有成员和保护成员在派生类中均变为保护的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。,保护派生,派生类中基类公有和保护成员降级使用,例4.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; ,class Student1: protected Student /用protected继承方式声明一个派生类public: void display1( ); private: int age; string addr;void Student1:display1( ) coutnum: numendl; /引用基类的保护成员,合法 coutname: nameendl; /引用基类的保护成员,合法 coutsex: sexendl; /引用基类的保护成员,合法 coutage: ageendl; /引用派生类的私有成员,合法 coutaddress: addrendl; /引用派生类的私有成员,合法,int main( ) Student1 stud1; /stud1是派生类student1的对象 stud1.display1( ); /display1是派生类中的公用成员函数 stud1.num=10023; return 0; ,4.4.4 多级派生时的访问属性直接派生类 间接派生类直接基类 间接基类,例4.4 多级派生的访问属性,class 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;,class C: protected B /protected方式public: void f5(); private: int n;,4.5 派生类的构造函数和析构函数,基类的构造函数和析构函数都不被继承,需要在派生类中重新定义。由于派生类继承了基类的成员,在初始化时,也要同时初始化基类成员。可通过调用基类的构造函数对基类成员完成初始化。派生类构造函数定义的一般格式为:派生类名:构造函数名(参数表):基类构造函数名(参数表) 派生类中新增数据成员初始化语句,例4.5 简单的派生类的构造函数,#include #includeusing namespace std;class Student /声明基类 public: /公用部分 Student(int n,string nam,char s ) /基类构造函数 num=n; name=nam; sex=s; Student( ) /基类析构函数 protected: /保护部分 int num; string name; char sex ;,class Student1: public Student /声明公用派生类student public: Student1(int n,string nam,char s,int a, string ad) : Student(n,nam,s) /派生类构造函数 age=a; /在函数体中只对派生类新增的数据成员初始化 addr=ad; void show( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; coutage: ageendl; coutaddress: addrendlendl; Student1( ) /派生类析构函数 private: /派生类的私有部分 int age; string addr; ;,int main( ) Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai); Student1 stud2(10011,Zhang-fun,m,21,213 Shanghai Road,Beijing); stud1.show( ); /输出第一个学生的数据 stud2.show( ); /输出第二个学生的数据 return 0;,将派生类构造函数在类外定义Student1(int n,string nam,char s,int a, string ad);,Student1:Student1(int n,string nam,char s,int a, string ad) : Student(n,nam,s) age=a; addr=ad; ,类中函数声明不包括基类构造函数名及其参数列表,定义函数时才给出。,Student1(int n,string nam,char s,int a, string ad) : Student(10010,nam,s),Student1(int n,string nam,char s,int a, string ad) : Student(10010,nam,s),age(a),addr(ad),派生类构造函数的执行顺序: (1)先调用基类的构造函数 (2)最后执行派生类构造函数的函数体派生类析构函数的执行顺序: (1)先执行派生类析构函数 (2)再执行基类析构函数,4.5.2 有子对象的派生类的构造函数,类的数据成员中还可以包含类对象Student s1;s1是类对象中的内嵌对象,称为子对象。,教材案例调试:P172 例8.7,例4.6 包含子对象的派生类的构造函数,#include #include using namespace std;class Student /声明基类 public: /公用部分 Student(int n,string nam) /基类构造函数 num=n; name=nam; void display() /输出基类数据成员 coutnum:numendlname:nameendl; protected: /保护部分 int num; string name;,class Student1: public Student /用public继承方式声明派生类student public: Student1(int n,string nam,int n1,string nam1,int a,string ad) :Student(n,nam),monitor(n1,nam1) /派生类构造函数 age=a; /在此处只对派生类新增的数据成员初始化 addr=ad; void show( ) coutThis student is:endl; display(); /输出num和name coutage: ageendl; coutaddress: addrendlendl; void show_monitor() /输出子对象的数据成员 coutendlClass monitor is:endl; monitor.display(); /调用基类成员函数 private: /派生类的私有数据 Student monitor; /定义子对象(班长) int age; string addr; ;,int main( ) Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijing Road,Shanghai); stud1.show( ); /输出第一个学生的数据 stud1.show_monitor(); /输出子对象的数据 return 0; ,派生类构造函数定义的一般格式为:派生类名:构造函数名(总参数表):基类构造函数名(参数表,子对象名(参数表列) 派生类中新增数据成员初始化语句,基类构造函数和子对象的次序可以是任意的,编译系统根据相同的参数名确定传递关系,派生类构造函数的调用顺序如下:基类的构造函数子对象类的构造函数派生类的构造函数,class B:public A int y; A a1;public: B(int a, int b):A(a),a1(3)y=b; .;,当撤销派生类对象时,析构函数的调用正好相反。,基类的构造函数子对象类的构造函数派生类的构造函数,基类成员构造用基类名,基类子对象构造用对象名,4.5.3 多层派生时的构造函数,#include #includeusing namespace std;class Student /声明基类 public: /公用部分 Student(int n, string nam ) /基类构造函数 num=n; name=nam; void display( ) /输出基类数据成员 coutnum:numendl; coutname:nameendl; protected: /保护部分 int num; /基类有两个数据成员 string name;,class Student1: public Student /声明公用派生类Student1 public: Student1(int n,string nam,int a):Student(n,nam) /派生类构造函数 age=a; /在此处只对派生类新增的数据成员初始化 void show( ) /输出num,name和age display(); /输出num和name coutage: ageendl; private: /派生类的私有数据 int age; /增加一个数据成员 ;,class Student2:public Student1 /声明间接公用派生类student2 public: /下面是间接派生类构造函数 Student2(int n,string nam,int a,int s):Student1(n,nam,a) score=s; void show_all() /输出全部数据成员 show(); /输出num和name coutscore:scoreendl; /输出age private: int score; /增加一个数据成员 ;,int main( ) Student2 stud(10010,Li,17,89); stud.show_all( ); /输出学生的全部数据 return 0; ,多层派生时的构造函数 只需写出其上一层派生类(即它的直接基类)的构造函数即可。例:基类 student(int n, string nam)派生类 student1(int n, string nam,int a) :student(n,nam)派生类 student2(int n, string nam,int a,int s) : student1 (n , nam ,a),student,student1,student2,Student(int n, string nam ) /基类构造函数Student1(int n,string nam,int a):Student(n,nam) /派生类构造函数Student2(int n,string nam,int a,int s):Student1(n,nam,a)注意:只需写出其上一层派生类(直接基类)的构造函数,初始化顺序:先初始化基类studen的数据成员num和name.再初始化student1的数据成员age。最后初始化student2的数据成员score。例:student2 stud(10010,”Li”,17,89);,4.5.4 派生类构造函数的特殊形式4.5.5 派生类的析构函数派生类析构函数执行时将自动调用基类及内嵌对象的析构函数,因此不必显式调用。 派生类构造函数的执行顺序: (1)先执行派生类的析构函数。 (2)然后调用子对象的析构函数。 (3)最后调用基类的析构函数。,在派生类中:创建派生类对象时,如何调用基类的构造函数对派生对象的基类部分数据初始化?撤消派生类对象时,如何调用基类的析构函数对基类对象的数据成员进行善后处理?,复习总结,当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。1. 派生类构造函数的一般格式:例:employee(char *n, int a,char s,char *d,int w):person(n,a,s) department=new char strlen(d)+1; ; employee obj1(“zhang”,28,m,”computer”,1500);当基类的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数。,派生类名:派生类名(总形参列表):基类名(实参列表) /派生类中新增数据成员初始化语句,2. 可在派生类内定义它的构造函数,也可在类内声明,类外定义。其格式为:类内声明:类外定义:基类构造函数的实参也可直接使用常量或全局变量。,派生类名(总形参列表);,派生类名:派生类名(总形参列表):基类名 (实参列表) /派生类中新增数据成员的初始化语句,3. 当派生类中含有对象成员时,其构造函数的一般形式为:,派生类名:派生类名(总参数表列) : 基类名(参数表列0) , 对象成员名1(参数 表列1) , , 对象成员名n(参数表列n) ; /派生类中新增数据成员初始化语句 ,4. 派生类构造函数任务: 对基类的数据成员初始化; 对子对象数据成员初始化; 对派生类新增数据成员初始化。,利用初始化表,传递参数,在函数体内初始化,也可利用初始化表,5. 在定义派生类对象时,构造函数与析构函数的调用顺序为:,构造函数,析构函数,6. 多层派生时的构造函数 只需写出其上一层派生类(即它的直接基类)的构造函数即可。例:基类 student(int n, string nam)派生类 student1(int n, string nam,int a) :student(n,nam)派生类 student2(int n, string nam,int a,int s) : student1 (n , nam ,a),student,student1,student2,初始化顺序:先初始化基类studen的数据成员num和name.再初始化student1的数据成员age。最后初始化student2的数据成员score。例:student2 stud(10010,”Li”,17,89);,说明:当基类的构造函数至少带一个参数,它所有的派生类都必须定义构造函数,甚至所定义的派生类构造函数的函数体可能为空,仅仅起参数的传递作用。若基类使用缺省构造函数或不带参数的构造函数,则在派生类中定义构造函数时可略去“:基类名(参数表)”;此时若派生类也不需要构造函数,则可不定义构造函数。如果派生类的基类也是一个派生类,则每个派生类只需负责其直接基类的构造,依次上溯。由于析构函数是不带参数的,在派生类中是否要定义析构函数与它所属的基类无关,故基类的析构函数不会因为派生类没有析构函数而得不到执行,它们各自是独立的。,派生类构造函数和析构函数的调用顺序,基类的构造函数子对象类的构造函数派生类的构造函数,先执行派生类的析构函数。 然后调用子对象的析构函数。 最后调用基类的析构函数。,休息一下,巩固所学的知识,4.6 多重继承(参见教材8.3节),多重继承定义:一个类有两个或多个直接基类。声明多重继承的方法: 多重继承派生类的构造函数:,继承列表,各基类的排列顺序任意。派生类构造函数的执行顺序:先调基类构造函数(按声明派生类时基类出现的顺序,依次调用),再调派生类构造函数。多继承时类的层次关系有很多种:,C,A B,C,A B,N,N,【例4.7】 多重继承,#include #include using namespace std;class Teacher /声明Teacher(教师)类 public: /公用部分 Teacher(string nam,int a,string t) /构造函数 name=nam; age=a; title=t; void display() /输出教师有关数据 coutname:nameendl; coutageageendl; couttitle:titleendl; protected: /保护部分 string name; int age; string title; /职称;,class Student /声明类Student(学生) public: Student(string nam,char s,float sco) name1=nam; sex=s; score=sco; /构造函数 void display1() /输出学生有关数据 coutname:name1endl; coutsex:sexendl; coutscore:scoreendl; protected: /保护部分 string name1; char sex; float score; /成绩 ;,class Graduate:public Teacher,public Student /声明多重继承的派生类Graduate public: Graduate(string nam,int a,char s,string t,float sco,float w): Teacher(nam,a,t),Student(nam,s,sco),wage(w) void show( ) /输出人员的有关数据 coutname:nameendl; coutage:ageendl; coutsex:sexendl; coutscore:scoreendl; couttitle:titleendl; coutwages:wageendl; private: float wage; /工资 ;,int main( ) Graduate grad1(Wang-li,24,f,assistant,89.5,1234.5); grad1.show( ); return 0;,项目实践教材案例调试:P177 例8.11,4.6.3 多重继承引起的二义性问题,1. 基类有同名成员引起的二义性 多继承时,不同基类可能有同名成员,这样派生类中就可能有从不同基类继承的同名成员,在引用时产生二义性。2. 从多个路径继承同一个基类引起的二义性 多重继承时,低层的派生类有可能从不同的路径继承同一个基类的成员多次,引用这样的成员时也会产生二义性。,4.6.3 多重继承引起的二义性问题,(1) 两个基类有同名成员,冲突,A,B,C,D v;,v.x=5;,public,派生类对象,产生了冲突,class Apublic: int x; void Show()cout x=xn; A(int a=0)x=a;class Bpublic: int x; void Show()cout x=xn; B(int a=0)x=a;class C:public A,public Bint y;public: void Setx(int a) x=a; /c1对象中有两个x成员 void Sety(int b)y=b; int Gety() return y;void main(void)C c1;c1.Show(); /c1对象中有两个Show()函数 ,这时,可以利用类作用域符:来指明数据或函数的来源。如:c1.A:x=a; c1.B:Show();,Class Apublic:Int a;Void display();Class BPublic:Int a;Void display();Class C:public A,public BPublic:Int b;Void show;,C c1;C1.a=3;C1.display();,C1.A:a=3;C1.A:display();,A:a=3; /指当前对象A:display();,(2)两个基类和派生类三者都有同名成员,A,D,public,基类成员,派生类新增成员,D v;,v.x=5;,当派生类中新增加的数据或函数与基类中原有的同名时,若不加限制,则优先调用派生类中的成员。,5,class Apublic:int x;void Show()cout x=xn;class Bpublic:int y;void Show()cout y=yn;class C:public A,public Bpublic:int y; /类B和类C均有y的成员;void main(void) C c1; c1.x=100; c1.y=200;/给派生类中的y赋值 c1.B:y=300;/给基类B中的y赋值 c1.A:Show(); c1.B:Show();/用作用域运算符限定调用的函数 cout y=c1.yn;/输出派生类中的y值 cout y=c1.B:yn;/输出基类B中的y值,(3) 类A和类B是从同一个基类派生的,#include class CBase0 protected:int b0;public:CBase0(int x=0)b0=x;int GetB0()return b0;,class CBase1 : public CBase0 public:CBase1(int x=0) : CBase0(x);class CBase2 : public CBase0 public:CBase2(int x=0) : CBase0(x);,class CDerived : public CBase1,public CBase2 public:CDerived(int x,int y):CBase1(x),CBase2(y);void main()CDerived d1(1,2);cout d1.GetB0() endl; ,产生二义性,可使用域运算符和基类名来限定,改为:d1.CBase1:GetB0()或d1.CBase2:GetB0(),4.6.4虚基类,类B 是类A的派生类,A类,B类,C类,D类,类A拷贝,类C 是类A的派生类,类D 是类B和类C的派生类,这样,类D中就有两份类A的拷贝,B类,C类,类A拷贝,这种同一个公共的基类在派生类中产生多个拷贝,不仅多占用了存储空间,而且可能会造成多个拷贝中的数据不一致 和模糊的引用。,D d;d.x=10; /模糊引用,在多重派生的过程中,若使公共基类在派生类中只有一个拷贝,则可将这种基类说明为虚基类。,class B: virtual public Apublic:int y;B(int a=0, int b=0 ):A(b) y=a;,虚基类的声明 class 派生类名 :virtual 继承方式 基类名,虚基类是在声明派生类时指定的,class C: virtual public A;,为了保证虚基类在派生类中只继承一次,应在该基类的所有直接派生类中声明为虚基类。,A类,B类,C类,D类,一份拷贝,在D( )的构造函数中直接调用A(),由虚基类派生出的对象初始化时,直接调用虚基类的构造函数。因此,若将一个类定义为虚基类,则一定有正确的构造函数可供所有派生类调用。,Class D:public B,public CD(int n):A(n),B(n),C(n)在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化。,3.虚基类的简单应用举例,#include #include using namespace std;/定义公共基类Personclass Person public: Person(string nam,char s,int a) /构造函数 name=nam;sex=s;age=a; protected: /保护成员 string name; char sex; int age;/定义类Teacherclass Teacher:virtual public Person /声明Person为公用继承的虚基类 public: Teacher(string nam,char s,int a,string t):Person(nam,s,a) /构造函数 title=t; protected: /保护成员 string title; /职称;,/定义类Studentclass Student:virtual public Person /声明Person为公用继承的虚基类 public: Student(string nam,char s,int a,float sco): /构造函数 Person(nam,s,a),score(sco) /初始化表 protected: /保护成员 float score; /成绩 ;,/定义多重继承的派生类Graduateclass Graduate:public Teacher,public Student /声明Teacher和Student类为公用继承的直接基类 public: Graduate(string nam,char s,int a, string t,float sco,float w): /构造函数 Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w) /初始化表 void show( ) /输出研究生的有关数据 coutname:nameendl; coutage:ageendl; coutsex:sexendl; coutscore:scoreendl; couttitle:titleendl; coutwages:wageendl; private: float wage; /工资 ;,int main( ) Graduate grad1(Wang-li,f,24,assistant,89.5,1234.5); grad1.show( ); return 0;,在编辑环境中调试,4.7 基类与派生类的转换(补充),赋值兼容规则,基类对象,派生类对象,相互之间能否赋值?,可以将派生类对象的值赋给基类对象。反之不行,Base b;,

    注意事项

    本文(C++中的继承与派生ppt课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开