freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

多態(tài)性和虛函數(shù)-資料下載頁

2025-07-18 19:50本頁面
  

【正文】 CharArray( ){delete Buff。} int GetLength( ){return Length。} char amp。 operator[ ](int i)。 private: int Length。 char *Buff。 }。 char amp。CharArray :: operator[ ](int i) { static char ch=0。 if( i Length amp。amp。 i = 0) return Buff[i]。 else { cout \nIndex out of range.。 return ch。 } } void main( ) { int t。 CharArray string1(6)。 char *string2 = string。 for(t = 0。 t 8。 t++) string1[t] = string2[t]。 cout \n。 for(t = 0。 t 8。 t++) cout string1[t]。 cout \n。 cout ( ) endl。 } Ans: Index out of range. Index out of range. string Index out of range. Index out of range. 6 [例 ] 重載 ()運算符 數(shù)學函數(shù)的抽象: f(x,y) = (x+5)*y include class F { public: double operator ( ) (double x, double y) const。 }。 double F :: operator ( )(double x, double y) const { return (x + 5) * y。 // (+5)* } void main( ) ( F f。 cout f( , ) endl。 } Ans: 3 虛函數(shù) ? 以上所述函數(shù)重載與運算符重載就是 C++中的多態(tài)性技術,所謂多態(tài)性技術是指調用同名函數(shù)完成不同的函數(shù)功能,或使用同名運算符完成不同的運算功能。它常用重載技術與虛函數(shù)來實現(xiàn)。在C++中,將多態(tài)性分為兩類:編譯時的多態(tài)性和運行時的多態(tài)性。 – 編譯時的多態(tài)性 編譯時的多態(tài)性是通過函數(shù)的重載或運算符的重載來實現(xiàn)的。函數(shù)的重載是根據函數(shù)調用時,給出不同類型的實參或不同的實參個數(shù),在程序執(zhí)行前就能確定調用哪一個函數(shù)。對于運算符的重載,是根據不同的運算對象在編譯時就可確定執(zhí)行哪一種運算。 如在前例中的“ +”運算: c3=c1+c2 與 a3=a1+a2,根據參加“ +”運算對象是復數(shù) c c2還實數(shù) a a2,就可確定是調用復數(shù)加法重載函數(shù)還是進行普通實數(shù)的加法運算。 – 運行時的多態(tài)性 運行時的多態(tài)性是指在程序執(zhí)行前,根據函數(shù)名和參數(shù)無法確定應該調用哪一個函數(shù),必須在程序執(zhí)行過程中,根據具體執(zhí)行情況來動態(tài)地確定。這種多態(tài)性是通過類的繼承關系和虛函數(shù)來實現(xiàn)的,主要用于實現(xiàn)一些通用程序的設計。 3 虛函數(shù) ? 虛函數(shù) 在基類中用關鍵字 virtual修飾的成員函數(shù)稱為虛函數(shù),虛函數(shù)的定義格式為: virtual 類名 函數(shù)名 (參數(shù)) {函數(shù)體 } 用虛函數(shù)實現(xiàn)“運行時多態(tài)性”的方法是:在派生類中定義與基類虛函數(shù)同名同參數(shù)同返回類型的成員函數(shù),在派生類中定義的這個成員函數(shù)也稱為虛函數(shù)。雖然基類中的虛函數(shù)與各派生類中虛函數(shù)同名同參數(shù),但由于各虛函數(shù)的函數(shù)體是不同,因而可用同名虛函數(shù)在運行時完成對不同對象的操作,從而實現(xiàn)“運行時多態(tài)性”。 下面舉例說明用虛函數(shù)實現(xiàn)“運行時多態(tài)性”的方法: 虛函數(shù) 【 例 】 定義基類 High,其數(shù)據成員為高 H,定義成員函數(shù) Show()為虛函數(shù)。然后再由 High派生出長方體類 Cuboid與圓柱體類 Cylinder。并在兩個派生類中定義成員函數(shù) Show()為虛函數(shù)。在主函數(shù)中,用基類 High定義指針變量 p,然后用指針 p動態(tài)調用基類與派生類中虛函數(shù)Show(),顯示長方體與圓柱體的體積。 include class High { protected: float H。 public: High(float h) { H=h。} virtual void Show() //在基類中定義虛函數(shù) Show() { coutHigh=Hendl。} }。 class Cuboid:public High { private: float Length,Width。 public: Cuboid(float l=0,float w=0,float h=0):High(h) { Length=l。 Width=w。} void Show() //在長方體派生類中定義虛函數(shù) Show() { coutLength=Length39。\t39。 coutWidth=Width39。\t39。 coutHigh=H39。\n39。 coutCuboid Volume=Length*Width*Hendl。 } }。 class Cylinder:public High { private: float R。 public: Cylinder(float r=0,float h=0):High(h) {R=r。} void Show() //在圓柱體派生類中定義虛函數(shù) Show() { coutRadius=R39。\t39。 coutHigh=H39。\n39。 coutCylinder Volume=R*R**Hendl。 } }。 void main(void) { High h(10),*p。 Cuboid cu(10,10,10)。 Cylinder cy(10,10)。 ()。 ()。 ()。 p=amp。h。 pShow()。 p=amp。cu。 pShow()。 p=amp。cy。 pShow()。 } 虛函數(shù) 執(zhí)行程序后輸出: High=10 Length=10 Width=10 High=10 Cubiod Volume=1000 Radius=10 High=10 Cylinder Volume= High=10 Length=10 Width=10 High=10 Cubiod Volume=1000 Radius=10 High=10 Cylinder Volume= 虛函數(shù) 在主函數(shù)中通過調用三個不同對象的成員函數(shù) ()。 ()。 ()。 分別輸出高、長方體、圓柱體的值。因在編譯時,根據對象名,就可確定調用哪一個成員函數(shù),所以這是編譯時的多態(tài)性。 虛函數(shù) 在主函數(shù)中將三個不同類型的對象起始地址依次賦給基 類的指針變量 p, p=amp。h。 pShow()。 p=amp。cu。 pShow()。 p=amp。cy。 pShow()。 這在 C++中是允許的,即可將由基類所派生出來的派生類對象的地址 amp。cu與 amp。cy賦給基類類型的指針變量 p。當基類指針變量指向不同的對象時,盡管調用的形式完全相同,均為 pShow()。 但確調用了不同對象中函數(shù)。因此輸出了不同的結果,所以這是運行時的多態(tài)性。 虛函數(shù) //////////////// ? 關于虛函數(shù)有幾點說明如下: ( 1)當基類中將成員函數(shù)定義為虛函數(shù)后,在其派生類中定義的虛函數(shù)必須與基類中虛函數(shù)同名同參數(shù)同返回類型,如上例中基類與派生類中的虛函數(shù)名均為 Show,均無參數(shù),返回類型均為 void。在定義派生類中的虛函數(shù)時,可不加關鍵詞 virtual。 ( 2)實現(xiàn)動態(tài)的多態(tài)性時,必須使用基類類型的指針變量,使該指針指向不同派生類的對象,并通過調用指針所指向的虛函數(shù)才能實現(xiàn)動態(tài)的多態(tài)性。 虛函數(shù) ( 3)虛函數(shù)必須是類的一個成員函數(shù),不能是友元函數(shù),也不能是靜態(tài)的成員函數(shù)。 ( 4)在派生類中沒有重新定義虛函數(shù)時,與一般的成員函數(shù)一樣,當調用這種派生類對象的虛函數(shù)時,則調用基類中的虛函數(shù)。 ( 5)可將析構函數(shù)定義為虛函數(shù),但不能將構造函數(shù)定義為虛函數(shù)。通常在釋放基類中和派生類中動態(tài)申請的存儲空間時,也要將析構函數(shù)定義為虛函數(shù),以便實現(xiàn)撤消對象時的多態(tài)性。 虛函數(shù) ( 6)虛函數(shù)與一般函數(shù)相比較,調用時執(zhí)行速度要慢一些。為了實現(xiàn)多態(tài)性。在每一個派生類中均要保持相應虛函數(shù)的入口地址表,函數(shù)調用機制也是間接實現(xiàn)的。因此除了要編寫一些通用的程序并一定要使用虛函數(shù)才能完成其功能要求外,通常不必使用虛函數(shù)。 [例 ] 虛析構函數(shù) include class A { public: virtual ~A( ){cout A::~A( ) called.\n。} }。 class B : public A { public: B(int i){buf = new char[i]。} virtual ~B( ) { delete [ ] buf。 cout B::~B( ) called.\n。 } private: char *buf。 }。 void fun(A *a) { delete a。 // 采用動態(tài)聯(lián)編,調用基類的 析構函數(shù) } void main( ) { A *a = new B(15)。 fun( a)。 } Ans: B::~B( ) called. A::~A( ) called. 不用虛函數(shù) : A::~A( ) called. [例 ] 分析程序,回答問題 include class A { public: virtual void act1( )。 void act2( ) {act1( )。} }。 void A::act1( ) { cout A::act1( ) called. endl。 } class B : public A { public: void act1( )。 }。 void B :: act1( ) { cout B::act1( ) called endl。 } void main ( ) { B b。 ( )。 } 回答下列問題 : 1. 該程序執(zhí)行后的輸出結果是什么?為什么? B::act1( ) called. 因為 B是 A的派生類, act1( )是類 A中的虛函數(shù),類 B 中的 act1( )自然是虛函數(shù)。 在 main( )函數(shù)中, ( )。 調用類 B中的 act2( )函數(shù), B是派生類實際上調用 A::act2( )函數(shù),則 A::act2( )函數(shù)的實現(xiàn)中調用 act1( ),由于有兩個 act1( )函數(shù),并且是虛函數(shù), 于是便產生動態(tài)聯(lián)編,根據運行時的情況選擇了 B::act1( )。所以輸出結果是: B::act1( ) called. 2. 如果將 A::act2( )的實現(xiàn)改為: void A::at2( ) { thisact1( )。 } 輸出結果如何? 輸出結果與前面相同 因為加了 this的限定,與沒加是一樣的, this是 指向操作該成員函數(shù)的對象的指針 3. 如果將 A::act2( )的實現(xiàn)改為 :
點擊復制文檔內容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1