物件导向程式语言讲义课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《物件导向程式语言讲义课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 物件 导向 程式 语言 讲义 课件
- 资源描述:
-
1、Derived Class 前言 衍生類別的定義 單一繼承 public,protected,和 privated 基底類別 virtual 成員函式 RTTI(Run-time Type Information)前言前言C+提供類別繼承的機制來擴充或更改現有類別的功能。我們可以利用此機制來達到以下兩個目的:程式碼的再利用(code reuse)物件導向的設計(object-oriented design)假定 B 是一個類別。我們可以用底下的格式來定義一個 B 的衍生類別 D:class D :public B/members of D;我們稱:D 繼承 B、B 是 D 的 base cla
2、ss(基底類別)或 superclass(父類別)、以及 D 是 B 的 derived class(衍生類別)或 subclass(子類別)。衍生類別的定義衍生類別的定義class Bclass D類別繼承的圖示類別繼承通常是用來表達 kind-of 關係(或稱 is-a 關係):衍生類別是基底類別的一種。譬如:Manager(經理)也是 Employee(員工),所以我們先規劃好 Employee 類別,然後把 Manager 定義成 Employee 的一個衍生類別:class Employee/other membersprivate:string first_name,family_
3、name;char middle_initial;Date hiring_date;short department;class Manager:public Employee/other membersprivate:set group;short level;Manager 的資料成員:string first_name,family_name;char middle_initial;Date hiring_date;short department;set group;short level;衍生類別除了本身的資料成員以外,也具有基底類別的資料成員。譬如:Employee 的資料成員:s
4、tring first_name,family_name;char middle_initial;Date hiring_date;short department;由於衍生類別是基底類別的子類別,因此衍生類別的物件可視為基底類別的物件;基底類別型態的指標也可用於衍生類別的物件,而不須要經過型態轉換。但反過來就不成立了。譬如:void foo(Manager mm,Employee ee)Employee*pe=&mm;/okManager*pm=ⅇ/errorpe-level=2;/error:Employee doesnt have/data member:levelpm=stati
5、c_cast(pe);/ok:explicit type castingpm-level=2;/ok:since pe points to a/Manager object衍生類別及其朋友(friends)可以直接使用基底類別的 public 或 protected 成員,但是不能使用基底類別的 private 成員。譬如:class B public:void f();protected:void g();int _x;private:void h();int _y;class D:public B friend void k(D);void a()f();/okvoid b()g();/o
6、kvoid c()_x=0;/ok void d()h();/errorvoid e()_y=0;/error;void k(D obj)obj.g();/okobj.f();/okobj._x=0;/okobj._y=0;/error存取控制存取控制 本身與其朋友 衍生類別與其朋友外界publicprotectedprivatexxx我們用下表來總結類別成員的存取控制:如果基底類別的成員函式不符合所需的話,我們可以在衍生類別中重新改寫(override)。譬如:class Employee public:void print();/other members;void Employee:pr
7、int()cout first_name middle_initial family_name;class Manager:public Employee public:void print();/other members;void Manager:print()Employee:print();cout level;這項改寫的機制讓 code reuse 可以很容易地達成。衍生類別的建構函式必須呼叫基底類別的建構函式(如果它存在的話),而且前者的參數必須包含後者的參數。譬如:class Employee public:Employee(const string&n,int d):famil
8、y_name(n),department(d)/other members;class Manager:public Employee public:Manager(const string&n,int d,int lvl):Employee(n,d),level(lvl)/other members;衍生類別的物件建構順序如下:1.執行基底類別的建構函式。2.執行衍生類別資料成員的建構函式。3.執行衍生類別的建構函式。衍生類別的物件解構順序則恰恰相反,即:1.執行衍生類別的解構函式。2.執行衍生類別資料成員的解構函式。3.執行基底類別的解構函式。資料成員和基底類別是按照宣告的順序來建構,解構
9、則按照相反的順序。拷貝衍生類別物件至基底類別物件時,只拷貝基底類別的資料成員。class Employee Employee(const Employee&);Employee&operator=(const Employee&);/;void f(const Manager&m)Employee e=m;/construct e from Employee part of me=m;/assign Employee part of m to e範例class CPoint2D public:CPoint2D(int x=0,int y=0):_x(x),_y(y)int x()return
10、_x;int y()return _y;void setX(int x)_x=x;void setY(int y)_y=y;void set(int x,int y)_x=x;_y=y;bool isZero()return _x=0&_y=0;double distance()return sqrt(_x*_x+_y*_y);protected:int _x,_y;我們利用 CPoint2D 類別來定義 CPoint3D 類別。首先我們把 CPoint2D 的 private 成員改成 protected 成員,讓 CPoint3D 可以使用它們。class CPoint3D:public
11、CPoint2D public:CPoint3D(int x=0,int y=0,int _z=0):CPoint2D(x,y),_z(z)int z()return _z;void setZ(int z)_z=x;void set(int x,int y,int z)set(x,y);setZ(z);bool isZero()return _x=0&_y=0&_z=0;double distance()return sqrt(_x*_x+_y*_y+_z*_z);private:int _z;CPoint3D 改寫(override)CPoint2D 的 isZero()和 distance
12、()函式。#include using namespace std;#include“CPoint3D.h”ostream&operator(ostream&os,CPoint3D p)os (p.x()“,“p.y()“,“p.z();return os;我們可以為 CPoint3D 類別定義輸出運算子 如下:測試程式#include“CPoint3D.h”int main()CPoint3D p(1,2,3);cout p endl;CPoint2D q(5,6);q=p;cout q endl;p=q;/error輸出結果(1,2,3)(1,2)範例typedef unsigned sh
13、ort big5char;class big5string:public string public:bool is_big5char(int idx);big5char next_char(int idx);int big5_length();private:bool in(char c,int min,int max)return min=c&c=0&idx length();char*cp=c_str();if(cpidx 128|idx=length()-1)return false;if(is_big5hiByte(cpidx)&is_big5loByte(cpidx+1)retur
展开阅读全文