1.1 覆蓋隱藏重載 重載,隱藏(重定義),覆蓋(重寫)—這幾個(gè)名詞看著好像很像,不過(guò)其實(shí)一樣都不一樣。 1.1.1 重載:(1) 概念:在同一個(gè)作用域內(nèi);函數(shù)名相同,參數(shù)列表不同(參數(shù)個(gè)數(shù)不同,或者參數(shù)類型不同,或者參數(shù)個(gè)數(shù)和參數(shù)類型都不同),返回值類型可相同也可不同;這種情況叫做c++的重載! 注意:c語(yǔ)言沒(méi)有函數(shù)重載的機(jī)制;
(2)舉例: #include<iostream> using namespace std; int Add(int a,int b) { return a+b; } float Add(float a,float b) { return a+b; } int main() { cout<<Add(4,5)<<endl;//調(diào)用 int Add(int a,int b) cout<<Add(2.5f,3.7f)<<endl;//調(diào)用 float Add(float a,float b) return 0; }
|
此時(shí),兩個(gè)函數(shù)Add();在同一作用域,函數(shù)名相同都是Add,參數(shù)類型不同;就構(gòu)成了c++中的函數(shù)重載; (3)c++函數(shù)重載達(dá)到的效果:調(diào)用函數(shù)名相同的函數(shù),會(huì)根據(jù)實(shí)參的類型和實(shí)參順序以及實(shí)參個(gè)數(shù)選擇相應(yīng)的函數(shù); (4)c++函數(shù)重載是一種靜態(tài)多態(tài)(又叫做靜態(tài)聯(lián)編,靜態(tài)綁定,靜態(tài)決議) 1.1.2 覆蓋(又叫重寫)(1)說(shuō)覆蓋之前先說(shuō)一個(gè)概念: 虛函數(shù):類的成員函數(shù)前面加virtual關(guān)鍵字,則這個(gè)成員函數(shù)稱為虛函數(shù) (2)覆蓋(重寫)的前提條件:父類函數(shù)為虛函數(shù); (3)覆蓋(重寫)的概念:當(dāng)在子類中定義了一個(gè)與父類完全相同的虛函數(shù)時(shí),則稱子類的這個(gè)函數(shù)重寫(也稱覆蓋)了父類的這個(gè)虛函數(shù)。 (4)什么是在子類中定義了一個(gè)與父類完全相同的虛函數(shù): 有兩種情況: 1.就是說(shuō)子類中的虛函數(shù)和父類中的虛函數(shù),函數(shù)名,參數(shù)個(gè)數(shù),參數(shù)類型,返回值類型都相同;這種情況下子類的這個(gè)虛函數(shù)重寫的父類中的虛函數(shù),構(gòu)成了重寫; 2、協(xié)變—是說(shuō)子類中的虛函數(shù)和父類中的虛函數(shù),函數(shù)名,參數(shù)個(gè)數(shù),參數(shù)類型都相同,只是返回值類型不同;父類的虛函數(shù)返回父類的指針或者引用,子類虛函數(shù)返回子類的指針或者引用;這種情況下子類的這個(gè)虛函數(shù)也重寫了父類中的虛函數(shù),也構(gòu)成了重寫;——我們把這種特殊的情況叫做協(xié)變 注意: 在子類中定義了一個(gè)與父類虛函數(shù)完全相同的函數(shù),那么這個(gè)子類的函數(shù)就是重寫了父類的虛函數(shù),此時(shí)這個(gè)子類的函數(shù)就是虛函數(shù),如果不顯示的加上virtual修飾,編譯器也會(huì)默認(rèn)為虛函數(shù); (5)覆蓋(重寫)達(dá)到的效果: 1.在子類中重寫了父類的虛函數(shù),那么子類對(duì)象調(diào)用該重寫函數(shù),調(diào)用到的是子類內(nèi)部重寫的虛函數(shù),而并不是從父類繼承下來(lái)的虛函數(shù);(這其實(shí)就是動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)); 2.在子類中重寫了父類的虛函數(shù),如果用一個(gè)父類的指針(或引用)指向(或引用)子類對(duì)象,那么這個(gè)父類的指針或用引用調(diào)用該重寫的虛函數(shù),調(diào)用的是子類的虛函數(shù);相反,如果用一個(gè)父類的指針(或引用)指向(或引用)父類的對(duì)象,那么這個(gè)父類的指針或用引用調(diào)用該重寫的虛函數(shù),調(diào)用的是父類的虛函數(shù) (6)舉例1:普通重寫+函數(shù)重載 //普通重寫+函數(shù)重載 #include<iostream> using namespace std; class Person//父類 { public: virtual void BuyTickets()//父類虛函數(shù) { cout<<" 買票-全票"<< endl; } protected : string _name; // 姓名 }; class Student : public Person//子類 { public: void BuyTickets()//子類虛函數(shù) { cout<<" 買票-半價(jià)"<<endl ; } protected : int _num ; //學(xué)號(hào) }; void Fun (Person* p) { p->BuyTickets(); } void Fun (Person&p) { p.BuyTickets(); } void Test () { Person p ; Student s; Fun(p); Fun(s); Fun(&p); Fun(&s); } int main() { Test(); return 0; }
|
1.1.3 隱藏(重定義)(1)隱藏(重定義)概念: 是指在不同的作用域中(分別在父類和子類中),函數(shù)名相同,不能構(gòu)成重寫的都是重定義。 (2)隱藏(重定義)的使用范圍: 重定義的不光是類的成員函數(shù),還可以是類的成員變量; (3)隱藏(重定義)的直接效果: 如果在父類和子類中有相同名字的成員;那么在子類中。會(huì)將父類的成員隱藏;隱藏以后的直接效果就是:無(wú)論在子類的內(nèi)部或者外部(通過(guò)子類成員)訪問(wèn)該成員;全都是訪問(wèn)子類的同名成員;如果在子類內(nèi)部或者外部(通過(guò)子類成員)訪問(wèn)同名的成員函數(shù),則需要根據(jù)函數(shù)調(diào)用的規(guī)則來(lái)調(diào)用子類的同名成員函數(shù);否則調(diào)用失敗; #include<iostream> using namespace std; class A { protected: A(int x=2) :_a(x) {} //public: // //1 // void show() // { // cout<<"A::shou()"<<endl; // } //public: // //2 // virtual void show() // { // cout<<"A::shou()"<<endl; // } public: //3 void show(int a) { cout<<"A::shou()"<<endl; } public: int _a; }; class B:public A { public: B(int x=1) :_a(x) {} //public: // //1 // void show(int b) // { // cout<<"B::shou()"<<endl; // } //public: // //2 // void show(int a) // { // cout<<"B::shou()"<<endl; // } public: //3 void show(int a,int b) { cout<<"B::shou()"<<endl; cout<<_a<<endl; } public: int _a; }; int main() { B b; cout<<(b._a)<<endl; b.show(1); return 0; }
|
程序中所標(biāo)明的1,2,3三種情況都是成員隱藏!
|