日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

初识C++之函数重载、重写、重定义的区别

發(fā)布時間:2024/9/27 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识C++之函数重载、重写、重定义的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在C++的學(xué)習(xí)中,慢慢接觸了一些很容易混淆的名詞,今天就來剖析幾個容易混淆的名詞。
1、函數(shù)重載
  重載函數(shù)是函數(shù)的一種特殊情況,為方便使用,C++允許在同一范圍中聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(指參數(shù)的個數(shù)、類型或者順序)必須不同,也就是說用同一個運(yùn)算符完成不同的運(yùn)算功能。這就是重載函數(shù)。重載函數(shù)常用來實(shí)現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。

想要構(gòu)成重載函數(shù)必須要滿足以下幾個條件:
①作用域相同;
②函數(shù)名相同;
③參數(shù)列表不同(參數(shù)個數(shù)、參數(shù)類型不同或者參數(shù)順序不同);

下面給出具體的實(shí)例:
①參數(shù)個數(shù)不同

class A { public:void Fun() {cout << "Fun()" << endl;}void Fun(int i){cout << "Fun(int i)" << endl;} private:int data; };

②參數(shù)類型不同

class A { public:void Fun(int i) {cout << "Fun(int i)" << endl;}void Fun(double d){cout << "Fun(double d)" << endl;} private:int data; };

③參數(shù)順序不同

class A { public:void Fun(int i, double d) {cout << "Fun(int i, double d)" << endl;}void Fun(double d, int i){cout << "Fun(double d, int i)" << endl;} private:int data; };

注意:僅僅返回值不同是無法構(gòu)成重載的

class A { public:void Fun(int i) {cout << "no return" << endl;}int Fun(int i){cout << "return i;" << endl;return i;} private:int data; };

上面的代碼編譯會報錯:

上面的例子都放在類中是因?yàn)橄胍砻魉鼈兪窃谕蛔饔糜?#xff0c;當(dāng)然這個不是必須的,只要滿足在同一作用域即可。
關(guān)于函數(shù)重載的調(diào)用機(jī)制可以參考:
http://blog.csdn.net/ljx_5489464/article/details/50962363
PS:運(yùn)算符重載也屬于函數(shù)重載。

2、函數(shù)重寫
  函數(shù)重寫其實(shí)就是函數(shù)覆蓋,當(dāng)你在派生類中聲明了一個與基類函數(shù)的函數(shù)名、返回值、參數(shù)列表完全相同,函數(shù)體相同或不同的成員函數(shù)時,你就已經(jīng)將基類函數(shù)重寫了,當(dāng)你在用基類對象或基類對象的指針調(diào)用該函數(shù)時,就是調(diào)用的派生類的函數(shù)了。

想要構(gòu)成重寫函數(shù)必須要滿足以下幾個條件:
①作用域不同(分別處于基類和派生類,也就是它是在繼承關(guān)系中才會存在的);
②函數(shù)名相同、參數(shù)列表、返回值必須相同(協(xié)變除外,這個后面會講到);
③基類必須有virtual關(guān)鍵字,也就是基類要被重寫的函數(shù)必須是虛函數(shù);
④訪問修飾符可以不同(也就是是否構(gòu)成重寫與訪問修飾符無關(guān));

下面給出實(shí)例:
①簡單的重寫關(guān)系

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std;class Base { private:virtual void Fun(int i){cout << "Base::Fun()" << endl;} private:int data; };class Derived : public Base { public:void Fun(int i){cout << "Derived::Fun()" << endl;} private:int data; };int main() {Derived d;d.Fun(1);return 0; }


可以看到在派生類中,對基類的Fun函數(shù)進(jìn)行了重寫,所以這兒會調(diào)用派生類的Fun函數(shù)。

②特殊的重寫關(guān)系–>協(xié)變
  在基類中有個虛函數(shù)返回基類的指針,在派生類中有個和基類同名虛函數(shù)返回派生類的指針,這種情況稱為協(xié)變

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std;class Base { public:virtual Base* Fun(){cout << "Base:" << this << endl ;return this;} private:int data; };class Derived: public Base { public:virtual Derived* Fun(){cout << "Derived:" << this << endl;return this;} private:int data; };int main() {Base b;Derived d;Base *pb = b.Fun();Derived *pd = d.Fun();cout << "pb = " << pb << endl;cout << "pd = " << pd << endl;return 0; }

3、函數(shù)重定義
  這里的重定義跟我們平時遇到的錯誤列表中的重定義不一樣,平時我們的我們遇到的錯誤列表里的重定義是指在同一作用域里定義了函數(shù)名相同、返回值相同、參數(shù)列表相同的函數(shù)(這樣肯定會報錯啊,因?yàn)槲覀冊谡{(diào)用函數(shù)時,編譯器不知道該為我們調(diào)用哪一個行函數(shù),會產(chǎn)生二義性),我們今天要講的函數(shù)重定義,是一種合法的重定義,它是在不同的作用域里的函數(shù)因?yàn)槟撤N機(jī)制產(chǎn)生的原因。
  
想要構(gòu)成重寫函數(shù)必須要滿足以下幾個條件:
①作用域不同(分別處于基類和派生類,也就是它是在繼承關(guān)系中才會存在的);
②函數(shù)名相同
③沒有構(gòu)成重寫
其實(shí)簡單講,只要滿足前兩條,并且沒有構(gòu)成重寫,就構(gòu)成了函數(shù)重定義(感覺有點(diǎn)說廢話的感覺)。

還是上實(shí)例:
①只是函數(shù)體不同

class Base { private:void Fun(int i){cout << "Base::Fun()" << endl;} private:int data; };class Derived : public Base { public:void Fun(int i){cout << "Derived::Fun()" << endl;} private:int data; };

②函數(shù)參數(shù)列表不同

⑴ class Base { private:void Fun(){cout << "Base::Fun()" << endl;} private:int data; };class Derived : public Base { public:void Fun(int i){cout << "Derived::Fun()" << endl;} private:int data; };⑵ class Base { private:virtual void Fun() //即使有virtual關(guān)鍵字,也不能構(gòu)成重寫,因?yàn)榱韨€函數(shù)的參數(shù)列表不同,所以同樣是重定義{cout << "Base::Fun()" << endl;} private:int data; };class Derived : public Base { public:void Fun(int i){cout << "Derived::Fun()" << endl;} private:int data; };

這里都只是列舉了一些簡單的常見的例子,可以舉一反三。

PS:重載與覆蓋
  這里的重載與覆蓋是說派生類的函數(shù)與繼承于基類的同名函數(shù)的關(guān)系。本來區(qū)分重載與覆蓋并不算困難,但是C++的隱藏規(guī)則使問題復(fù)雜性陡然增加。這里“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:
   (1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時,不論有無virtual 關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。
   (2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual關(guān)鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆)。

總結(jié)

以上是生活随笔為你收集整理的初识C++之函数重载、重写、重定义的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。