【正文】
析構函數(shù) 也可以定義為虛函數(shù)。 友元 函數(shù)不能是虛函數(shù)。 抽象類的派生類必須覆蓋基類中所有純虛函數(shù),否則純虛函數(shù)被繼承,使派生類仍然是抽象類,而不能定義對象。 //表示這個函數(shù)沒有定義 抽象類 至少有一個純虛函數(shù)的類是一個 抽象類 。這樣的類不需要任何操作,也不必實例化,即不用定義對象。 類等級的 頂層 可以將所有公共函數(shù)都聲明為 純虛函數(shù) 。 virtual print( ){ } 任何對象 都不能調用 空虛函數(shù) 私有函數(shù)也可以聲明為虛函數(shù) 不能將 全局函數(shù) 或 靜態(tài)函數(shù) 聲明為虛函數(shù) 全局函數(shù),靜態(tài)函數(shù) 與對象無關 。 ,而其后的派生類需要這個虛函數(shù)。 基類 成員函數(shù)(公共或保護部分)使用 virtual ,中間類同名同參的函數(shù)自然也是虛函數(shù) show(B*t)時, 中間類 也要聲明 virtual函數(shù) ,必須建立 一條 基類到派生類的虛函數(shù) 路徑 。} later binding 輸出: Zhang Wang 99 Li puter Zhang Wang 99 Li puter print( )是 虛函數(shù) , 后聯(lián)編 , 程序根據(jù)調用 print的對象的實際類型決定如何操作 虛函數(shù)的用法 1. 動態(tài)聯(lián)編只能在基類和派生類中有 同名同參 的函數(shù)才能使用。c)。b)。a)。 ( )。 ( )。 B b(“Wang”,99)。} }。} void print( ) {A::print( )。 class C:public A { char *major。 cout“\n”grade。 public: B(char*p,int i):A(p) {grade=i。} }。 public: A(char*p) {strcpy(name,p)。c在 show中都看成是基類指針調用 print( )。a,amp。 } void show(A*t) {tprint( )。 show(amp。 show(amp。 show(amp。 ( )。 C c(“Li”, “puter”)。 void main( ) { A a(“Zhang”)。cout“\n”major。 public: C(char*p,char*q):A(p){strcpy(major,q)。} } 。} void print( ) {A::print( )。 class B:public A { char *grade。} void print( ) {cout“\n”name。 例 class A { char *name。 class B:virtual A class C:virtual A class D class A 構造函數(shù)的調用次序 先 虛基類(依聲明次序從左到右) 后 非虛基類(依聲明次序) 編制學校全體教職員工人員卡 在校人員 學生 教師 職工 本科生 研究生 在職研究生 兼職教師 要求:編號,姓名,性別,出生日期, 學生:系,級,三門主課成績, 研究生:專業(yè),導師 教師: 系,專業(yè),職稱, 職工: 部門, 職務 輸入: 10個代表人物,格式化打印 多態(tài)性和虛函數(shù) 不同的對象調用同一個函數(shù) 導致不同的操作稱為 多態(tài)性 運算符重載和函數(shù)重載 是最簡單的多態(tài)性 ?程序在 編譯時決定 由某對象對實例發(fā)出的消息,翻譯并完成所要求的操作,叫前期裝配,或早聯(lián)編( early binding),也叫 靜態(tài)聯(lián)編 。 這樣定義的 D類中 A的成員只繼承一次,可以 直接訪問 A的成員,也可以用 任意路徑 訪問。 class C : virtual public A。 class B class C class D class A 虛基類 虛基類 定義可以避免 雙重繼承 class B class C class D class A class A。 } }; //合法 同時執(zhí)行兩個 f 一個基類被派生出兩個以上導出類,這兩個導出類再生成一個多重導出類 . 在導出類 D中 , A的 一個元素 通過兩個途徑 被繼承了 兩次 。 //合法 void f( ){A::f( )。 //二義性 A的 f, B的 f ? ::f( )。 C c。 }。 }。 //合法 ::f( )。 ( )。 }。 class C : public A, public B { public: class B { public: void f( )。 class A class B class C class A { public: void f( )。導出類對象調用時出現(xiàn) 二義性 ,要用 類名域 加以區(qū)別?;惖拇涡驈淖蟮接?。}; 由多個基類派生出一個類 每個基類都應有自己的存定符 A,B的成員都自動成為 C的成員,存取權限同單繼承 class A class B class C 導出類的構造函數(shù)要為基類提供初始化參數(shù) 方法與單繼承相同。 class C : public A, public B {//正確, //顯式轉換 ——不能隱式轉換 多重繼承 class A。 //正確 bp=ap。 B *bp=new B。}。 //顯式轉換 強制類型轉換 6. 導出類的指針 1 公有基類 指向導出類對象的指針可以隱式轉換為指向基類對象的指針 反之不成立 class A { ,不能有二義性。 a=f(s)。 a=fun(s)。 T a=s。 X::operator T( )。 例 String::operator char *(void ) {return str。 不帶參數(shù),沒有返回類型。 //錯誤 用戶定義類型轉換 類型轉換函數(shù)重載 X::operator T( )。 //正確 b=a。 a=b。 A *ap=new A。}; B是 A的派生類, B是 A的超集 可以將類 B的對象 自動轉換 為 A類對象, 反之不成立 . A a。 class B : public A { ( )。 cout “\ncargo=”cargo。 //i=2 int j=( )。} } B b。 int fun( ){return 2。 public: // i=1 作用域分辨 class B : public A { // i=1 int j=( )。 B b。 int fun( )//覆蓋 A中同名元 {return 2。 public: } } class B : public A { 例 truck類的構造函數(shù) truck::truck(int a1, int a2, int b1, int b2, int c) : roadVehicle(a1,a2), a(b1,b2) { cargo=c。 void print( )。 int GetCargo(void)。 truck(int x):roadVehicle(x,x+1),a(x,x){ cargo=x。 roadVehicle a。 } 注意: 導出類的構造函數(shù)中 未寫明 基類構造函數(shù) 基類構造函數(shù)的參數(shù)無法傳遞, 這時導出類 自動調用 基類的無參構造函數(shù), 如果基類 沒有 無參構造函數(shù),就會出錯。 passengers=y。 cout “\ncargo=”cargo。友元 不繼承的部分 基類中同名的成員被派生類中相應的名字 覆蓋 class A class B : public A class C : public B private 不可見 不可見 protected protected protected public public public class A class B : private A class C : private B private 不可見 不可見 protected private 不可見 public private 不可見 保護成員 protected數(shù)據(jù)在基類中同 private 公有基類的 保護成員 和 公有成員 是導出類的保護和公有成員 私有基類的 保護成員 和 公有成員 是導出類私有成員 基類的 私有成員 在導出類中不可見只能通過基類的公有成員函數(shù)調用 例 void truck::print(void) { cout“\nwheels=”wheels //出錯 “\npassengers=”passengers //出錯 “\ncargo=”cargo。構造函數(shù)和析構函數(shù) 2。 }。 void Show(void)。 void SetCargo(int size)。 class truck : public roadVehicle { int cargo。 void print( ) {cout“\nwheels=”wheels “\nPassengers=”passengers。 int GetWheels(void)。 void SetWheels(int num)。 基類限制詞:public和 private指明基類成員在導出類中的訪問限制 class A class B : public A class C : public B 例: class roadVehicle { int wheels, passengers。}; class 新類名: private 基類名 //私有繼承 { ~List( )。 void Insert( T*, S*)。} 4.類模版可以嵌套 templateclass T, class S class List { NodeT,S *head, *current。} templateclass T,class S NodeT,S::~Node( ) {delete T_data。 T_data=t。 } template class T, class S NodeT,S::Node(NodeT,S*p, NodeT,S*q, T*t, S* s) { previous=p。 Public: Node(NodeT,S*, NodeT,S*,T*,S*)。 T *T_data。 } 3. 多于一個參數(shù)的模版 模版可以有 不止一個 參數(shù),可以是某 個簡單類型參數(shù),也可以是通用參數(shù)。 Arraypl