第11讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数.

Slides:



Advertisements
Similar presentations
第8章 继承和派生 8.1 继承与派生 8.2 派生类对基类成员的访问 8.3 派生类的构造函数与析构函数 8.4 多重继承与虚基类.
Advertisements

课程 要求 参考 书目 课程 内容 课程 练习.
面向对象的C++程序设计基础 第 4 章 继承与派生.
第四章 继承与派生 Chapter 4 Inheritance and Derivation
四資二甲 第三週作業 物件導向程式設計.
7.2 访问控制 —— 公有继承 公有继承练习 //Point.h #ifndef _POINT_H #define _POINT_H class Point { //基类Point类的定义 public: //公有函数成员 void initPoint(float x = 0, float.
内容提要 代码重用 类的继承 多态 抽象类 多重继承 虚拟继承. 常宝宝 北京大学计算机科学与技术系
類別與物件 Class & Object.
计算机可视化编程 基于Visual C++6.0的面向对象编程 第 四 讲 主讲教师:隋振                学时:32.
C++面向对象程序设计 第八章 继承和派生.
第12章 组合与继承 欢迎辞 第14次见面!.
面向对象程序设计 第三章 C++面向对象程序设计 武汉大学 赵小红.
第6章 继 承 主讲人:陈南京.
第四章 继承和派生类 汽车 专用汽车 运输汽车 货车 客车 消防车 洒水车 最普遍、最一般,可以自行驱动 含有汽车的特性,同时与汽车有不同
第14章 c++中的代码重用.
C++语言程序设计 第七章 继承与派生 清华大学 郑 莉.
C++ 面对对象程序设计 授课老师:.
第11章 类的继承和派生 继承是面向对象程序设计方法的四个基本特征之一,是程序代码可重用性的具体体现。
第八章 类和对象.
第6章 多态性与虚函数.
第九章 字符串.
类和对象 潘荣江 山东大学计算机科学与技术学院
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
版权所有 复制必究 第 3 章 C++面向对象程序设计.
授课老师:龚涛 信息科学与技术学院 2018年4月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第10章 C++面向对象程序设计 本章导读 C语言是一种结构化程序设计语言,它是面向过程的,在处理较小规模的程序时一般比较容易实现,而当程序规模较大时,C语言就显示出了它的不足。在这种情况下C++应运而生,C++语言是从C语言演变而来的,它保留了C语言的所有优点,同时也增加了面向对象的功能。现在C++已成为程序设计中应用最广泛的一种语言。
第11讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数.
第12讲 多继承与虚基类 多继承 虚基类.
辅导课程六.
第1章 C++基础.
第9讲 类与对象 9.1 面向对象程序设计的基本概念 9.2 对象与类的定义 9.3 内联函数 9.4 对象的使用.
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 QQ: 学习网站:
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
第六章 数据抽象-类 胡昊 南京大学计算机系软件所.
第八章 继承与派生 丘志杰 电子科技大学 计算机学院 软件学院.
第十一章 继承和派生. 主讲教师:全红艳 第十一章 继承和派生.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
C++大学基础教程 第9章 继承与派生 北京科技大学.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 QQ: 学习网站:
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第12讲 多继承与虚基类 多继承 虚基类.
$9 泛型基础.
C++复习3 ----类的继承与派生.
C#面向对象程序设计 $6 深入理解类.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第13讲 多态 友员函数 多态性与虚函数 纯虚函数和抽象类.
C++复习2----类与对象.
分裂对象模型 C++ otcl.
第三章 数据抽象.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
面向对象技术 练习 ffh.
C++程序设计基础 主讲人:谢昕 华东交通大学信息工程学院 第十~十二讲 多态性和虚函数 2005年春季学期.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计教程 第8章 继承与派生 第8章 继承与派生 制作人:杨进才.
辅导课程十五.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第十二讲 继承 与 派生.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Presentation transcript:

第11讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数

学习目标 理解类的继承的概念,掌握基类和派生类的定义 掌握三种继承方式下基类不同成员在派生类中访 问权限的变化和基类私有成员在派生类中的调用 方法 掌握两种情况下的构造函数和析构函数的调用

第10讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数

类的继承的提出 问题:能否在定义CollegeStudent类时充分利用已有的Student类,而不用重新定义所有成员? class Student { public: void display() cout<<num; cout<<name; } private: int num; //学号 char name[10]; //姓名 }; class CollegeStudent {public: void display() { cout<<num; cout<<name; cout<<speciality; } private: int num; //学号 char name[10]; //姓名 char speciality[5]; //专业 }; 问题:能否在定义CollegeStudent类时充分利用已有的Student类,而不用重新定义所有成员? 4

类的继承的提出 类的继承是面向对象程序设计中最重要的机制。 这种机制提供了无限重复利用程序资源的一种途 径。 类的继承是面向对象程序设计中最重要的机制。 这种机制提供了无限重复利用程序资源的一种途 径。 基于类的继承,可以扩充和完善旧的程序以适应 新的需求。这样不仅可以节省程序开发的时间和 资源,并且为未来程序增添了新的资源。 类的继承,其核心是基于已有的类快速创建新类 的方法。

类的继承—对生物遗传机制的模拟 人类的染色体

继承的多样性与稳定性 我和祖先很相似! 传83代

类的继承的概念 类A派生类B:类A为基类,类B为派生类。 B 派生类 A 基类 基类原有成员数据和成员函数 新增加的成员数据和成员函数

类的继承的概念 在C++语言中,一个派生类可以从一个基类派 生,也可以从多个基类派生。 从一个基类派生的继承称为单继承;从多个基 类派生的继承称为多继承。 在建立派生类的过程中,基类不会做任何改变, 派生类会在基类的基础上发生变化。

第10讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数

类的继承的实现 三种派生方式 A 基类 B 派生类 派生并不是简单的扩充,有可能改变基类的性质。 public: 表示公有派生 private:表示私有派生(默认) protected:表示保护派生 派生并不是简单的扩充,有可能改变基类的性质。 有三种派生方式:公有派生、保护派生、私有派生。 默认的是私有派生。

类的继承的实现 class B:public A{...}; class B:protected A{...}; 派生类名 继承方式 基类名 class ClassName:<Access>BaseClassName class B:public A{...}; class B:protected A{...}; class B:private A{...}; class B: A {...}; 默认为私有派生

类的继承的实现 派生类中新增加的成员 派生类名 继承方式 基类名 class ClassName:<Access>BaseClassName { private: ......; //私有成员说明 public: ......; //公有成员说明 protected: ......; //保护成员说明 } 派生类中新增加的成员

公有继承—保持基类成员属性 public A 基类 B 派生类 x y z Fx() Fy() Fz() x y z Fx() Fy() class ClassName: public BaseClassName A 基类 B 派生类 私有 x y z Fx() Fy() Fz() 私私有 x y z Fx() Fy() Fz() 保护 public 保护 公有 公有 基类继承 私有 私私有 保护 保护 公有 公有 私有 m n Fm() Fn() 公有继承时,基类中所有成员在派生类中保持各个成员的访问权限。派生类新增成员不能直接访问基类原私有成员,必须通过继承的基类公有或保护成员来间接访问 公有 派生类新增 私有 公有

调用基类公有成员函数,该函数又调用基类私有成员数据 调用派生类公有成员函数,该函数又调用派生类私有成员数据 公有继承举例 class Student {private: int num; public: void display(){cout<<num;}}; class CollegeStudent:public Student { private: char speciality; public: void display1( ) { cout<<speciality; } }; void main() CollegeStudent s; s.display(); s.display1(); return 0; } 公有成员 派生类中的基类成员函数能够访问派生类中继承的基类私有数据 公有继承 公有新增成员 调用基类公有成员函数,该函数又调用基类私有成员数据 调用派生类公有成员函数,该函数又调用派生类私有成员数据

私有继承时,基类中的公有和保护成员在派生类中均变为私有成员。派生类新增成员不能直接访问基类原私有成员,必须通过继承的基类其他成员来间接访问。 私有继承—基类成员全变成私有 class ClassName: private BaseClassName A 基类 B 派生类 私有 x y z Fx() Fy() Fz() 私私有 x y z Fx() Fy() Fz() 保护 private 私有 公有 私有 基类继承 私有 私私有 保护 私有 公有 私有 私有 m n Fm() Fn() 私有继承时,基类中的公有和保护成员在派生类中均变为私有成员。派生类新增成员不能直接访问基类原私有成员,必须通过继承的基类其他成员来间接访问。 公有 派生类新增 私有 公有

将display()换成cout<<num<<name可以吗 调用派生类公有成员函数,该函数又调用派生类私有成员数据 私有继承举例 display()中调用基类私有数据 class Student {public: void display(){ cout<<num<<name; } private: int num; char name[30]; }; class CollegeStudent:private Student {public: void display1( ) { display(); cout<<speciality; } private: char speciality; void main() { CollegeStudent s; s.display1(); return 0; } 基类私有成员不能由派生类新增函数调用,只能用基类成员函数调用 此处display()是什么属性? 将display()换成cout<<num<<name可以吗 调用派生类公有成员函数,该函数又调用派生类私有成员数据

保护继承—基类成员安全级提升 protected A 基类 B 派生类 x y z Fx() Fy() Fz() x y z Fx() class ClassName: protected BaseClassName A 基类 B 派生类 私有 x y z Fx() Fy() Fz() 私私有 x y z Fx() Fy() Fz() 保护 protected 私有 公有 保护 基类继承 私有 私私有 保护 私有 公有 保护 私有 m n Fm() Fn() 保护继承时,基类中原保护成员在派生类中变为私有成员,基类原公有成员在派生类中变为保护成员。派生类新增成员不能直接访问基类私有成员,必须通过继承的基类其他成员来间接访问。 公有 派生类新增 私有 公有

此处,派生类公有成员函数可以调用name吗? 调用派生类公有成员函数,该函数又调用派生类私有成员数据 保护继承举例 class Student { protected: int num; string name; }; class CollegeStudent:protected Student {public: void display ( ) { cout<<num; cout<<name; } void main() { CollegeStudent s; s.display (); s. name=“Zhang”; return 0; } 基类保护成员在保护派生下变为派生类私有成员,能够被派生类新增成员函数调用 此处,派生类公有成员函数可以调用name吗? 调用派生类公有成员函数,该函数又调用派生类私有成员数据 name为派生类私有,不能在类外调用

不同继承方式 基类成员变量或函数 派生类成员变量或函数 Public继承 Protected继承 Private继承 Public Private Private Protected Private Private Private Private Private Private Private

第10讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数

单继承中的构造函数和析构函数 如何初始化? class B { public: B(int bb) { b=bb;} private: int b; }; class C:public B { public: C(int cc){ c=cc; } private: B memB; int c; C int b; //基类数据成员 int c; //新增数据成员 B menB; //内嵌子对象 如何初始化?

(一)简单派生类的构造函数 简单派生类只有一个基类,数据成员中不包括基 类的对象。 简单派生类构造函数的定义形式为: 简单派生类只有一个基类,数据成员中不包括基 类的对象。 简单派生类构造函数的定义形式为: 派生类构造函数(总参数列表): 基类构造函数(参数列表) { 派生类中新增数据成员初始化; } 派生类的总参数类别,不仅能满足派生类新增成员的初始化需要,还要满足基类构造函数中的参数需要。

A(int a,int b,int c){x=a;y=b;z=c;}//基类初始化 int Getx(){return x;} //返回x class A { int x; protected: int y; public: int z; A(int a,int b,int c){x=a;y=b;z=c;}//基类初始化 int Getx(){return x;} //返回x int Gety(){return y;} //返回y void ShowA(){cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n';} }; class B:public A{ int m,n; public: B(int a,int b,int c,int d,int e):A(a,b,c){m=d;n=e;} void Show(){cout<<“m="<<m<<'\t'<<“n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum(){return ( Getx()+y+z+m+n);} void main(void) { B b1(1,2,3,4,5); b1.ShowA(); b1.Show(); cout<< "Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t'; cout << "y=" <<b1.Gety()<<'\t'; cout << "z="<<b1.z<<'\n';} 第一章 VC集成开发环境

定义基类A的对象,调用基类A的成员函数showA(),正确 class A { int x; protected: int y; public: int z; A(int a,int b,int c){x=a;y=b;z=c;}//基类初始化 int Getx(){return x;} //返回x int Gety(){return y;} //返回y void ShowA(){cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n';} }; class B:private A{ int m,n; public: B(int a,int b,int c,int d,int e):A(a,b,c){m=d;n=e;} void Show(){cout<<“m="<<m<<'\t'<<“n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum(){return ( Getx()+y+z+m+n);} void main(void) { B b1(1,2,3,4,5); b1.ShowA(); b1.Show(); cout<< "Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t'; cout << "y=" <<b1.Gety()<<'\t'; cout << "z="<<b1.z<<'\n';} 私有继承 定义基类A的对象,调用基类A的成员函数showA(),正确 错误 A a1(1,2,3); a1.ShowA(); 错误 第一章 VC集成开发环境 错误 错误

(一)简单派生类的构造函数 构造函数的执行顺序: 析构函数的执行顺序: 基类的构造函数。 派生类的构造函数。 派生类的析构函数。 基类的析构函数。

(二)有子对象的派生类构造函数 class Stu {protected: int num; char name[9]; }; 有子对象的派生类是指:派生类的成员包括基类 的对象。 class Stu {protected: int num; char name[9]; }; class ColStu:public Stu {public: void display( ); private: char speciality; Stu s;

(二)有子对象的派生类构造函数 有子对象的派生类构造函数的一般形式为: 派生类构造函数(总参数列表): 基类构造函数(参 数列表),子对象名(参数列表) { 派生类中新增数据成员初始化; } 派生类的总参数类别,不仅能满足派生类新增成员的初始化需要,还要满足基类构造函数以及子对象构造函数中的参数初始化需要。

class B { private: int b; public: B(int bb) { b=bb; cout<<"B:"<<b<<endl; } }; class C:public B { public: C(int aa,int bb,int cc):B(aa), memB(bb) { c=cc; cout<<"C:"<<c<<endl;} private: B memB; int c; void main() { C c(1,2,3); }

(二)有子对象的派生类构造函数 构造函数的执行顺序: 析构函数的执行顺序: 基类的构造函数。 子对象的构造函数。 派生类的构造函数。 派生类的析构函数。 子对象的析构函数。 基类的析构函数。

第10讲 类的继承 1. 类的继承的概念 2. 类的单继承机制 3. 单继承中的构造函数和析构函数

学习目标 理解类的继承的概念,掌握基类和派生类的定义 掌握三种继承方式下基类不同成员在派生类中访 问权限的变化和基类私有成员在派生类中的调用 方法 掌握两种情况下的构造函数和析构函数的调用 目标层次:理解和记忆 目标层次:分析与综合 目标层次:归纳与扩展

思考: 多个基类来共同派生一个类如何实现? D A 类A成员 类B成员 B 类C成员 C 新增成员