第1周windows編程基礎12講從到2 c_第1頁
第1周windows編程基礎12講從到2 c_第2頁
第1周windows編程基礎12講從到2 c_第3頁
第1周windows編程基礎12講從到2 c_第4頁
第1周windows編程基礎12講從到2 c_第5頁
已閱讀5頁,還剩33頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

中科研CASoft軟件工程師培訓講義Game

Master游戲修改工具第2講從C到C++(2)中科天地軟件人才培訓中心Created

by本講重點提要繼承與派生多態性繼承與派生類描述了一組有相同特性(數據元素)和相同行為(函數)的對象。類實際上就是數據類型,例如,浮點數也有一組特性和行為。區別在于程序員定義類是為了與具體問題相適應,而不是被迫使用已存在的數據類型。類型不僅僅說明一組對象上的約束,還說明與其他類

型之間的關系。兩個類型可以有共同的特性和行為,

但是,一個類型可能包括比另一個類型更多的特性,

也可以處理更多的消息(或對消息進行不同的處理)。繼承表示了基本類型和派生類型之間的相似性。一個

基本類型具有所有由它派生出來的類型所共有的特性

和行為。程序員創建一個基本類型以描述系統中一些

對象的思想核心。由這個基本類型派生出其他類型,

表達了認識該核心的不同途徑。繼承與派生比如設計一個類來表示“形體”,每個

形體有大小、顏色、位置等。每個形體

能被繪制、擦除、移動、著色等。由此,可以派生出特殊類型的形體:圓、正方

形、三角形等,它們中的每一個都有另

外的特性和行為,例如,某些形體可以

翻轉。有些行為可以不同(計算形體的

面積)。類型層次結構既體現了形體間

的類似,又體現了它們之間的區別。繼承與派生基本概念保持已有類的特性而構造新類的過程稱為繼承。在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。被繼承的已有類稱為基類(或父類)。派生出的新類稱為派生類。繼承的目的:實現代碼重用。派生的目的:當新的問題出現,原有程序無法解決(或不能完全解決)時,需要對原有程序進行改造。繼承與派生派生類的定義方法class

派生類名:繼承方式(public/private/protected)基類名1,基類名2,

….{成員定義;}多繼承:一個派生類有多個基類;單繼承:一個派生類只有一個基類。public指明了基類是一公有基類,也可以用private來指明基類為一私有基類用戶沒有指明private或public時,系統默認為private繼承與派生共有三種繼承方式:公有繼承(public),私有繼承(private),保護繼承(protected)。繼承方式指定派生類成員以及類外對象對繼承來的成員的訪問權限。不同繼承方式的影響主要體現在:派生類成員對基類成員的訪問控制。派生類對象對基類成員的訪問控制。繼承與派生公有繼承基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的

private成員不可訪問。派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能訪問基類的

private成員。派生類的對象只能訪問基類的public成員。繼承與派生私有繼承基類的public和protected成員都以

private身份出現在派生類中,但基類的

private成員不可訪問。派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能訪問基類的

private成員。派生類的對象不能訪問基類中的任何成員。繼承與派生保護繼承基類的public和protected成員都以

protected身份出現在派生類中,但基類的private成員不可訪問。派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能訪問基類的

private成員。派生類的對象不能訪問基類中的任何成員。繼承與派生訪問權限的派生傳遞關系派生類private

private基類public派生類作用區域外privatepublic派生類作用區域內不可見不可見不可見protectedpublicprotected

privatepublic

publicprivateprivate派生類作

派生類作用區域內

用區域外不可見不可見不可見繼承與派生繼承時的構造函數基類的構造函數不被繼承,需要在派生類中自行定義。定義構造函數時,只需要對本類中新增成員進行初始化,對繼承來的基類成員的初始化由基類的構造函數完成。但派生類構造函數的定義中,要提供基類構造函數所需要的參數。單一繼承時的構造函數派生類名::派生類名(基類所需的形參,本類成員所需的形參):基類名(參數){本類成員初始化賦值語句;};–

如:C::C(int

i,int

j):B(I)繼承與派生多繼承時的構造函數派生類名::派生類名(基類1形參,基類2形參,...基類n形參,本類形參):基類名1(參數),基類名2(參數),...基類名n(參數){本類成員初始化賦值語句;};當基類中定義有缺省形式的構造函數或未定義構造函數時,派生類構造函數的定義中可以省略對基類構造函數的調用若基類中未定義構造函數,派生類中也可以不定義,全采用缺省形式構造函數。當基類定義有帶形參的構造函數時,派生類也應定義構造函數,提供將參數傳遞給基類構造函數的途徑。繼承與派生構造函數的調用次序調用基類構造函數,調用順序按照它們被繼承時聲明的順序(從左向右)。調用成員對象的構造函數,調用順序按照它們在類中聲明的順序。派生類的構造函數體中的內容。繼承與派生繼承時的析構函數析構函數也不被繼承,派生類自行定義。定義方法與一般(無繼承關系時)類的析構函數相同。不需要顯式地調用基類的析構函數,系統會自動隱式調用。析構函數的調用次序與構造函數相反。繼承與派生派生類與基類的關系賦值兼容原則一個公有繼承的派生類的對象在使用上可以被當作基類的對象,反之則禁止。具體表現在:派生類的對象可以被賦值給基類對象。派生類的對象可以初始化基類的引用。指向派生類及基類對象的指針以public方式繼承時,指向基類的指針也可以指向派生類。通過指向基類對象的指針可以指向它的公有派生的對象,但不能指向私有派生的對象;這種指針只能訪問從基類中繼承的公有成員,不能訪問派生類本身的成員;但不能將一個派生類對象的指針指向其基類對象。繼承與派生二義性問題在多繼承時,基類與派生類之間,或基類之間出現同名成員時,將出現訪問時的二義性(不確定性)——采用虛函數或支配(同名覆蓋)原則來解決。當派生類從多個基類派生,而這些基類又從同一個基類派生,則在訪問此共同基類中的成員時,將產生二義性——采用虛基類來解決。虛基類虛基類的引入用于有共同基類的場合定義以virtual修飾說明基類例:class

B1:virtual

public

B作用主要用來解決多繼承時可能發生的對同一基類繼承多次而產生的二義性問題.為最遠的派生類提供唯一的基類成員,而不重復產生多次拷貝注意:在第一級繼承時就要將共同基類設計為虛基類。多態性多態性(Polymorphism)多態性是面向對象程序設計的重要特征之一。多態性是指發出同樣的消息被不同類型的對象接收時導致完全不同的行為。多態的實現:函數重載運算符重載虛函數多態性:運算符重載運算符重載運算符重載是對已有的運算符賦予多重含義必要性C++中預定義的運算符其運算對象只能是基本數據類型,而不適用于用戶自定義類型(如類)實現機制運算符重載的實質就是函數重載:每個運算符對應各自的運算符函數,根據操作數的不同調用不同的同名函數。將指定的運算表達式轉化為對運算符函數的調用,運算對象轉化為運算符函數的實參。多態性:運算符重載運算符重載的規則和限制編譯系統對重載運算符的選擇,遵循函數重載的選擇原則。可以重載C++中除下列運算符外的所有運算符:.

.*

::

?:只能重載C++語言中已有的運算符,不可臆造新的。不改變原運算符的優先級和結合性。不能改變操作數個數。經重載的運算符,其操作數中至少應該有一個是自定義類型。多態性:運算符重載運算符重載的兩種形式重載為類的成員函數:函數類型operator

運算符(形參表){

函數體

}重載為類的友元函數:friend

函數類型operator

運算符(形參表){

函數體

}多態性:運算符重載重載為類成員函數時參數個數=原操作數個數-1

(后置++、--除外)當類的對象調用這種運算符函數時,對象中的成員數據就可以是一個操作數,另一個操作數才通過參數傳遞來獲得。如:class

complex{publiccomplex

operator

+

(complex

c2);…….

}多態性:運算符重載重載為友元函數時參數個數=原操作數個數,且至少應該有一個自定義類型的形參。友元函數是類以外的函數,調用這種運算符函

數時,所有的操作數都要通過參數傳遞來獲得。如:class

complex{publicfriend

complex

operator

+

(complex

c1,complex

c2);…….

}多態性:運算符重載雙目運算符B如果要重載B

為類成員函數,使之能夠實現表達式oprd1

B

oprd2,其中oprd1

為A

類對象,則B

應被重載為A

類的成員函數,形參類型應該是oprd2所屬的類型。經重載后,表達式oprd1

B

oprd2

相當于oprd1.operator

B(oprd2)多態性:運算符重載范例:將“+”、“-”運算重載為復數類的成員函數。規則:實部和虛部分別相加減。操作數:兩個操作數都是復數類的對象。多態性:運算符重載復數類的實現:class

complex{public://復數類聲明//外部接口complex(double

r=0.0,double

i=0.0){real=r;imag=i;}//構造函數/+重載為成員函數//-重為載成員函數//輸出復數//私有數據成員//復數實部//復數虛部complex

operator

+

(complex

c2);complex

operator-

(complex

c2);void

display();private:double

real;double

imag;};多態性:運算符重載重載運算符函數的實現complex

complex::operator

+(complex

c2){complex

c;c.real=c2.real+real;c.imag=c2.imag+imag;return

complex(c.real,c.imag);}complex

complex::operator

-

(complex

c2){complex

c;c.real=real-c2.real;c.imag=imag-c2.imag;return

complex(c.real,c.imag);}多態性:運算符重載練習:使用前面實現的復數類及重載的運算符創建一個基于控制臺的應用程序,接受用戶輸入的復數(分別輸入實部和虛部),實現復數的加減運算。多態性:運算符重載前置單目運算符U如果要重載U

為類成員函數,使之能夠實

現表達式U

oprd,其中oprd

為A類對象,則U

應被重載為A

類的成員函數,無形參。經重載后,表達式U

oprd

相當于a.operator

U()多態性:運算符重載后置單目運算符++和--如果要重載

++或--為類成員函數,使之能夠實現表達式oprd++或

oprd--,其中

oprd為A類對象,則

++或--

應被重載為A

類的成員函數,且具有一個

int

類型形參。經重載后,表達式oprd++

相當于oprd.operator

++(0)多態性:運算符重載運算符友元函數的設計如果需要重載一個運算符,使之能夠用于操作某類對象的私有成員,可以此將運算符重載為該類的友元函數。函數的形參代表依自左至右次序排列的各操作數。后置單目運算符++和--的重載函數,形參列表中要增加一個int,但不必寫形參名。靜態聯編與動態聯編靜態聯編與動態聯編:由于同名對象的多態性,程序在執行時需要確定具體的操作對象,即具體決定調用哪個函數。這種程序自身彼此關聯的過程,稱為聯編。用來確定程序中的操作調用與執行該操作的代碼間的關系。聯編可以在編譯時完成,也可在運行時完成,分別稱為靜態聯編和動態聯編。多態性:虛函數概念:虛函數是動態聯編的基礎。是非靜態的成員函數。具有繼承性,基類中定義了虛函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論