c一11继承与派生_第1页
c一11继承与派生_第2页
c一11继承与派生_第3页
c一11继承与派生_第4页
c一11继承与派生_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、面向对象程序设计1l11.1 继承与派生的概念l11.2 派生类的声明方式l11.3 派生类的构成l11.4 派生类成员的访问属性l11.5 派生类的构造函数和析构函数l11.7 基类与派生类的转换l11.8 组合与继承2l“继承”(inheritance)是在一个已存在类的基础上建立一个新类已存在的类称为“基类(base class)”或“父类(father class)”, 新建类称为“派生类(derived class)”或“子类(son class)”If I have seen a little further it is by standing on the shoulders o

2、f Giants. - Isaac Newton3派生类是基类的具体化, 基类是派生类的抽象.45class 派生类名派生类名 : 继承方式继承方式 基类名基类名 派生类新增成员派生类新增成员class Student1 : public Studentpublic: void display_1() cout “age: ” age endl; cout “address: ” address endl; private: int age; string address;class Studentpublic: void display() cout “num: ” num endl; co

3、ut “name: ” name endl; cout “sex: ” sex endl;private: int num; string name; char sex;基类基类派生类派生类三种继承方式: private, protected, public示例示例6从基类继承来的数据成员和成员函数, 可调整其访问属性派生类增加的数据成员和成员函数构造函数和析构函数不能从基类继承, 因此派生类需重新定义自己的构造函数和析构函数.l类的数据成员和函数的访问权限私有成员私有成员(private): 只能被类自身的成员访问, 不能被类外以及派生类访问公有成员公有成员(public): 可以被任何普通

4、函数和任何类的成员函数访问保护成员保护成员(protected): 对于派生类是完全可见的, 对于其他类则是私有的78基类成员基类成员公用继承公用继承私有继承私有继承保护继承保护继承私有成员不可访问不可访问不可访问公用成员publicprivateprotected保护成员protectedprivateprotected成员在派生类中的访问属性与其继承方式有关.l私有成员不能继承私有成员不能继承对于不需要往下继承的类, 可用私有继承方式掩藏l如果在类中声明了保护成员, 意味着该类可能要用作基类, 其派生类中会访问这些成员9私有继承和保护继承较少使用, 一般情况下使用公用继承方式.10#inc

5、lude #include using namespace std;class Studentpublic: void display( );protected: int num; string name; char sex;void Student:display( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl;class Student1: protected Studentpublic: void display1( );private: int age; string addr;void Student1:displa

6、y1( ) cout “num: ”numendl; /合法合法 coutaddress: addrendl;int main( ) Student1 stud1; stud1.display1( );/ stud1.num=10023; /类外不能访问类外不能访问 return 0;11class Apublic: int i;protected: int j; void f2();private: int k;基类基类class B : public Apublic: void f3();protected: void f4();private: int m;public继承继承class

7、 C : protected Bpublic: void f5();private: int n;protected继承继承ijf2kf3f4mf5n基类基类A公用公用保护保护保护保护私有私有派生类派生类B公用公用保护保护保护保护/公用公用保护保护私有私有派生类派生类C保护保护保护保护保护保护/保护保护保护保护/公用公用私有私有l基类构造函数不能继承, 因此, 派生类构造函数需要初始化:派生类增加数据成员的初始化基类数据成员初始化l解决方法在执行派生类构造函数时, 调用基类构造函数12l简单派生类(只有一个基类和一级派生)构造函数及其执行顺序:1.基类构造函数: 初始化基类数据成员2.派生类构

8、造函数: 初始化派生类数据成员13派生类构造函数名派生类构造函数名(总参数表列总参数表列) : 基类构造函数名基类构造函数名(参参数表列数表列) 派生类中新增数据成员初始化语句派生类中新增数据成员初始化语句14#include #includeusing namespace std;class Studentpublic: Student(int n, string nam, char s) num = n; name = nam; sex = s; Student() protected: int num; string name; char sex;class Student1: publ

9、ic Studentpublic: Student1(int n, string nam, char s, int a, string ad) : Student(n, nam, s) age = a; addr = ad; void show( ) cout num: num endl; . cout address: addr endl; Student1( ) private: int age; string addr;15int main( ) Student1 stud1(10010, Wang-li, f, 19, 115 Beijing Road, Shanghai) ; Stu

10、dent1 stud2(10011, Zhang-fun, m, 21, 213 Shanghai Road, Beijing) ; stud1.show( ) ; stud2.show( ) ; return 0;l在类外定义:l直接使用常量或利用初始化表:16Student1(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;/直

11、接使用常量或全局变量直接使用常量或全局变量Student1(string nam, char s, int a, string ad) :Student(10010, nam, s) /利用初始化表利用初始化表Student1(int n, string nam, char s, int a, string ad) :Student(n, nam, s) , age(a) , addr(ad) l类的数据成员中包含类对象, 称为子对象(subobject)l有子对象派生类构造函数及其执行顺序:1.基类构造函数: 初始化基类数据成员2.子对象构造函数: 初始化子对象数据成员3.派生类构造函数:

12、初始化派生类数据成员17派生类构造函数名派生类构造函数名(总参数表列总参数表列) : 基类构造函数名基类构造函数名(参参数表列数表列), 子对象名子对象名(参数表列参数表列)派生类中新增数据成员初始化语句派生类中新增数据成员初始化语句18#include #include using namespace std;class Studentpublic: Student(int n, string nam) : num(n), name(nam) void display( ) cout “num:” num endl “name:” name endl; protected: int num;

13、 string name;class Student1: public Studentpublic: 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(); coutage: ageendl; coutaddress: addrendlendl; void show_monitor( ) coutendlClas

14、s monitor is:endl; monitor.display( ); private: Student monitor; int age; string addr;19int main( ) Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijing Road, Shanghai); stud1.show( ); stud1.show_monitor(); return 0;1. 基类构造函数和子对象的次序可以是任意的;2. 如果有多个子对象, 应列出每一个子对象.20/派生类派生类Student2的构造函数调用其的构造函数调用其直

15、接基类直接基类的构造函数的构造函数Student2(int n, string nam, int a, int s): Student1(n, nam, a), score(s) l如果不需要对派生类新增成员初始化, 派生类构造函数体可以为空l如果基类没有定义构造函数, 派生类中可以不写基类构造函数l如果基类和子对象中没有定义构造函数, 也不需要初始化派生类数据成员, 可不必定义派生类构造函数21Student1(int n, string nam, int n1, int nam1): Student(n, nam, a), monitor(n1, nam1) l派生类不能继承基类析构函数派

16、生类不能继承基类析构函数l派生类析构函数执行时将自动调用基类及子对象的析构函数, 因此不必显式调用l派生类析构函数执行顺序:1.执行派生类析构函数2.按照声明子对象的相反次序, 依次调用子对象的析构函数3.最后调用基类析构函数22l派生类对象可向基类对象赋值23A a1;B b1;a1 = b1; /OK1. 只有公用派生类继承了基类全部功能, 才是基类真正的子类型.2. 只能用子类对象对基类对象赋值, 而不能反过来.l派生类对象可向基类对象的引用赋值或初始化24A a1;B b1;A &r = b1; /初始化初始化r = b1; /赋值赋值此时, r不是b1的别名, 而是b1基类部

17、分的别名.l如果函数的形参是基类对象或基类对象的引用, 可用子类对象作实参25void fun(A& r) cout r.num display( ); /调用调用stud1.display函数函数/pt指针指向指针指向grad1, 但实际指向但实际指向grad1从基类继承的部分从基类继承的部分pt = &grad1;/调用调用grad1.display函数函数, 实际调用的是基类的实际调用的是基类的displaypt-display( ); 指向基类对象的指针, 只能访问派生类中的基类成员, 而不能访问派生类中增加的成员.27#include #include using n

18、amespace std;class Studentpublic: Student(int, string, float); void display( );private: int num; string name; float score;Student:Student(int n, string nam, float s) num=n; name=nam; score=s;void Student:display( ) coutendlnum:numendl; coutname:nameendl; coutscore:scoreendl;class Graduate : public Studentpublic: Graduate(int, string , float, float); void display( );private: float pay;Graduate:Graduate(int n, string nam, float s, float p) : Student(n, nam, s), pay(p) void Graduate:display( ) Student:display(); cout pay= pay display( ); pt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论