Presentation is loading. Please wait.

Presentation is loading. Please wait.

课程 要求 参考 书目 课程 内容 课程 练习.

Similar presentations


Presentation on theme: "课程 要求 参考 书目 课程 内容 课程 练习."— Presentation transcript:

1 课程 要求 参考 书目 课程 内容 课程 练习

2 课程内容 继承 概述 面向对象程序设计 单一继承 派生类中构造和析构函数 课程要求 参考书目 返回首页 面向对象程序设计

3 概述* 引言一:编程中的代码重复 class CPerson { public: void print();
private: char name[10]; int age; char sex; }; class CEmployee { public: void print(); private: char name[10]; int age; char sex; char department[20]; float salary; }; 面向对象程序设计 2-16

4 概述 引言二:泛化/特化 面向对象编程的三种机制 泛化是一种在保存类的差异的同时共享类的相似性的抽象机制 数据抽象 泛化/特化 多态
在面向对象的分析与设计中,泛化/特化机制 是从已有的类派生新的类的机制。 在面向对象的编程中,通过继承实现泛化/特化 面向对象程序设计 2-16

5 概述 继承 是指从一个或多个基类中继承数据结构和操作,形成新的派生类的一种机制。
继承其实是一个类与该类的一个或多个精化版本之间的关系。被精化的类是超类(基类、父类),每一个精化版本成为子类(派生类) 面向对象程序设计 2-16

6 概述 基类(父类) 类A 属性 服务 类B 派生类(子类) 面向对象程序设计 2-16

7 概述 直升飞机 生产者 标识号 重量 价格 子类 ISA 飞行器 生产者 标识号 重量 价格 喷气 战斗机 生产者 标识号 重量 价格
父类 导弹 发射导弹 面向对象程序设计 2-16

8 概述* 分类 单一继承 多重继承 飞行器 直升飞机 喷气战斗机 研究生 教职工 在职研究生 单一继承 多重继承 back 2-16
面向对象程序设计 2-16

9 单一继承* 派生类声明的格式(单一继承) class 派生类名:派生方式 基类名 {…… };
1、派生方式在public、private、protected中选择, 缺省时默认为private。 2、派生类只能继承基类中的公有成员和保护成员, 而不能继承私有成员 3、构造函数、析构函数、友元关系、重载的new 和delete运算符是不可继承的 面向对象程序设计 2-16

10 单一继承 基类成员在派生类中的访问属性 基类 public protected private 派生类 面向对象程序设计 2-16

11 单一继承 class person { public: person(char *n,int a); char * getname();
memo 派生类 class person { public: person(char *n,int a); char * getname(); int getage(); void setname(char *n); void setage(int a); private: char name[40]; int age,height,weight;}; 面向对象程序设计 2-16

12 单一继承 服务和属性的继承关系 类 employee 服务 属性 person getname getage setname setage
char name[40] int age int height int weight getsalary setsalary int salary 面向对象程序设计 2-16

13 对各种继承方式的讨论 公有派生 继承方式 基类 public protected private 派生类 面向对象程序设计 2-16

14 对各种继承方式的讨论 class CDerived:public CBase { int len,wid; public:
memo class CDerived:public CBase { int len,wid; public: CDerived(int a,int b) {len=d; wid=e; } void show() { cout<<len<<wid<<endl; cout<<"x="<<Getx(); cout<<"\ty="<<y; cout<<"\tz="<<z<<endl; } int sum() {return Getx()+y+z+len+wid;} }; 问题: CBase中的x被继承下来了吗, 在CDerived中需要用到x如何访问 对于y,在CDerived中能够直接调用吗,如果定义了对象CDerived ob,如何访问y 面向对象程序设计 2-16

15 对各种继承方式的讨论 私有派生 基类 public protected private 派生类 面向对象程序设计 2-16

16 对各种继承方式的讨论* class CBase { protected: int a; public: int b;
memo back class CBase { protected: int a; public: int b; void set(int x, int y) { a=x; b=y;} void Show() { cout<<a<<b<<endl;} }; class CDerived:private CBase { public: void setD(int x,int y) { set(x,y);} void showD() {cout<<a<<b<<endl;} }; 面向对象程序设计 2-16

17 派生类的析构与构造函数* 对执行次序的讨论
构造函数:首先执行基类的构造函数,再执行 派生类的构造函数。 析构函数:先执行派生类的析构函数,再执行 基类的 class base { public: base() {cout<<“base”<<endl;} ~base() {cout<<“~base”<<endl;} }; class derive:public base { public: derive() {cout<<“derive”<<endl;} ~derive() {cout<<“~derive”<<endl;} }; 面向对象程序设计 2-16

18 派生类的析构与构造函数 对构造规则的讨论 派生类构造函数定义形式: 派生类名(参数表):基类名(参数表)
如果有多个基类,则冒号后面可以用以下 形式: 基类1(参数表), 基类2(参数表)…… 各个基类的次序与运行结果无关 构造规则 面向对象程序设计 2-16

19 派生类的析构与构造函数 派生类含有对象成员 构造函数定义形式: 派生类名(参数表):基类名(参数表),对象成员(参数表)
如果有多个基类和多个对象,则冒号后面可以 用以下形式: 基类1(参数表), 基类2(参数表)……, 对象成员1(参数表),对象成员2(参数表)…… 面向对象程序设计 2-16

20 派生类的析构与构造函数 派生类含有对象成员 构造函数执行顺序如下: 基类的构造函数 对象成员的构造函数 派生类的构造函数
析构函数的执行次序与上述相反 面向对象程序设计 2-16

21 派生类的析构与构造函数 class A {int a; public: A(int i)
memo 派生类含有对象成员 class A {int a; public: A(int i) {a=i; cout<<"A"<<endl; } ~A() {cout<<"~A"<<endl;} }; class base {int x; public: base(int i) {x=i;cout<<"base"<<x<<endl;} ~base() {cout<<"~base"<<x<<endl;}}; 面向对象程序设计 2-16

22 派生类的析构与构造函数 小结 基类构造函数不带参数,派生类不一定需要定 义构造函数,但是当基类的构造函数有参数, 所有的派生类都必须定义构造函数 若基类使用缺省构造函数或不带参数的构造函 数,则派生类中定义的构造函数可以省略冒号 后面部分,派生类也可不定义构造函数 面向对象程序设计 2-16

23 派生类的析构与构造函数* 小结 如果派生类的基类也是一个派生类,则每个派 生类只需负责直接基类的构造
back 小结 如果派生类的基类也是一个派生类,则每个派 生类只需负责直接基类的构造 由于析构函数不带参数,派生类中是否需要 定义析构函数与基类无关,基类和派生类的析 构函数是各自独立的 多层继承 面向对象程序设计 2-16


Download ppt "课程 要求 参考 书目 课程 内容 课程 练习."

Similar presentations


Ads by Google