课程 要求 参考 书目 课程 内容 课程 练习
课程内容 继承 概述 面向对象程序设计 单一继承 派生类中构造和析构函数 课程要求 参考书目 返回首页 面向对象程序设计
概述* 引言一:编程中的代码重复 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
概述 引言二:泛化/特化 面向对象编程的三种机制 泛化是一种在保存类的差异的同时共享类的相似性的抽象机制 数据抽象 泛化/特化 多态 在面向对象的分析与设计中,泛化/特化机制 是从已有的类派生新的类的机制。 在面向对象的编程中,通过继承实现泛化/特化 面向对象程序设计 2-16
概述 继承 是指从一个或多个基类中继承数据结构和操作,形成新的派生类的一种机制。 继承其实是一个类与该类的一个或多个精化版本之间的关系。被精化的类是超类(基类、父类),每一个精化版本成为子类(派生类) 面向对象程序设计 2-16
概述 基类(父类) 类A 属性 服务 继 承 派 生 类B 性 务 属 服 派生类(子类) 面向对象程序设计 2-16
概述 直升飞机 生产者 标识号 重量 价格 子类 ISA 飞行器 生产者 标识号 重量 价格 喷气 战斗机 生产者 标识号 重量 价格 父类 导弹 发射导弹 面向对象程序设计 2-16
概述* 分类 单一继承 多重继承 飞行器 直升飞机 喷气战斗机 研究生 教职工 在职研究生 单一继承 多重继承 back 2-16 面向对象程序设计 2-16
单一继承* 派生类声明的格式(单一继承) class 派生类名:派生方式 基类名 {…… }; 1、派生方式在public、private、protected中选择, 缺省时默认为private。 2、派生类只能继承基类中的公有成员和保护成员, 而不能继承私有成员 3、构造函数、析构函数、友元关系、重载的new 和delete运算符是不可继承的 面向对象程序设计 2-16
单一继承 基类成员在派生类中的访问属性 基类 public protected private 派生类 面向对象程序设计 2-16
单一继承 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
单一继承 服务和属性的继承关系 类 employee 服务 属性 person getname getage setname setage char name[40] int age int height int weight getsalary setsalary int salary 面向对象程序设计 2-16
对各种继承方式的讨论 公有派生 继承方式 基类 public protected private 派生类 面向对象程序设计 2-16
对各种继承方式的讨论 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
对各种继承方式的讨论 私有派生 基类 public protected private 派生类 面向对象程序设计 2-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
派生类的析构与构造函数* 对执行次序的讨论 构造函数:首先执行基类的构造函数,再执行 派生类的构造函数。 析构函数:先执行派生类的析构函数,再执行 基类的 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
派生类的析构与构造函数 对构造规则的讨论 派生类构造函数定义形式: 派生类名(参数表):基类名(参数表) 如果有多个基类,则冒号后面可以用以下 形式: 基类1(参数表), 基类2(参数表)…… 各个基类的次序与运行结果无关 构造规则 面向对象程序设计 2-16
派生类的析构与构造函数 派生类含有对象成员 构造函数定义形式: 派生类名(参数表):基类名(参数表),对象成员(参数表) 如果有多个基类和多个对象,则冒号后面可以 用以下形式: 基类1(参数表), 基类2(参数表)……, 对象成员1(参数表),对象成员2(参数表)…… 面向对象程序设计 2-16
派生类的析构与构造函数 派生类含有对象成员 构造函数执行顺序如下: 基类的构造函数 对象成员的构造函数 派生类的构造函数 析构函数的执行次序与上述相反 面向对象程序设计 2-16
派生类的析构与构造函数 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
派生类的析构与构造函数 小结 基类构造函数不带参数,派生类不一定需要定 义构造函数,但是当基类的构造函数有参数, 所有的派生类都必须定义构造函数 若基类使用缺省构造函数或不带参数的构造函 数,则派生类中定义的构造函数可以省略冒号 后面部分,派生类也可不定义构造函数 面向对象程序设计 2-16
派生类的析构与构造函数* 小结 如果派生类的基类也是一个派生类,则每个派 生类只需负责直接基类的构造 back 小结 如果派生类的基类也是一个派生类,则每个派 生类只需负责直接基类的构造 由于析构函数不带参数,派生类中是否需要 定义析构函数与基类无关,基类和派生类的析 构函数是各自独立的 多层继承 面向对象程序设计 2-16