淺談C++重載、重寫、重定義
一、重載(overload)
指函數(shù)名相同,但是它的參數(shù)表列個(gè)數(shù)或順序,類型不同。但是不能靠返回類型來(lái)判斷。
(1)相同的范圍(在同一個(gè)作用域中) ;
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無(wú)。
(5)返回值可以不同;
二、重寫(也稱為覆蓋 override)
是指派生類重新定義基類的虛函數(shù),特征是:
(1)不在同一個(gè)作用域(分別位于派生類與基類) ;
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有 virtual 關(guān)鍵字,不能有 static 。
(5)返回值相同(或是協(xié)變),否則報(bào)錯(cuò);<—-協(xié)變這個(gè)概念我也是第一次才知道…
(6)重寫函數(shù)的訪問(wèn)修飾符可以不同。盡管 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的
三、重定義(也成隱藏)
(1)不在同一個(gè)作用域(分別位于派生類與基類) ;
(2)函數(shù)名字相同;
(3)返回值可以不同;
(4)參數(shù)不同。此時(shí),不論有無(wú) virtual 關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載以及覆蓋混淆) 。
(5)參數(shù)相同,但是基類函數(shù)沒(méi)有 virtual關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆) 。
#include <iostream>
#include <complex>
using namespace std;
class Base
{
public:
virtual void a(int x) { cout << "Base::a(int)" << endl; }
// overload the Base::a(int) function
virtual void a(double x) { cout << "Base::a(double)" << endl; }
virtual void b(int x) { cout << "Base::b(int)" << endl; }
void c(int x) { cout << "Base::c(int)" << endl; }
};
class Derived : public Base
{
public:
// redefine the Base::a() function
void a(complex<double> x) { cout << "Derived::a(complex)" << endl; }
// override the Base::b(int) function
void b(int x) { cout << "Derived::b(int)" << endl; }
// redefine the Base::c() function
void c(int x) { cout << "Derived::c(int)" << endl; }
};
int main()
{
Base b;
Derived d;
Base* pb = new Derived;
// ----------------------------------- //
b.a(1.0); // Base::a(double)
d.a(1.0); // Derived::a(complex)
pb->a(1.0); // Base::a(double), This is redefine the Base::a() function
// pb->a(complex<double>(1.0, 2.0)); // clear the annotation and have a try
// ----------------------------------- //
b.b(10); // Base::b(int)
d.b(10); // Derived::b(int)
pb->b(10); // Derived::b(int), This is the virtual function
// ----------------------------------- //
delete pb;
return 0;
}
通過(guò)這里可以看出:
1. Base類中的第二個(gè)函數(shù)a是對(duì)第一個(gè)的重載
2. Derived類中的函數(shù)b是對(duì)Base類中函數(shù)b的重寫,即使用了虛函數(shù)特性。
3. Derived類中的函數(shù)a是對(duì)Base淚中函數(shù)a的隱藏,即重定義了。
4.pb指針是一個(gè)指向Base類型的指針,但是它實(shí)際指向了一個(gè)Derived的空間,這里對(duì)pd調(diào)用函數(shù)的處理(多態(tài)性)取決于是否重寫 (虛函數(shù)特性)了函數(shù),若沒(méi)有,則依然調(diào)用基類。
5. 只有在通過(guò)基類指針或基類引用 間接指向派生類類型時(shí)多態(tài)性才會(huì)起作用。
6. 因?yàn)锽ase類的函數(shù)c沒(méi)有定義為virtual虛函數(shù),所以Derived類的函數(shù)c是對(duì)Base::c()的重定義。
以上這篇淺談C++重載、重寫、重定義就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
循環(huán)隊(duì)列詳解及隊(duì)列的順序表示和實(shí)現(xiàn)
這篇文章主要介紹了循環(huán)隊(duì)列詳解及隊(duì)列的順序表示和實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-12-12
C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可展開(kāi))
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,實(shí)現(xiàn)掃雷展開(kāi)和提醒,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
C語(yǔ)言指針學(xué)習(xí)經(jīng)驗(yàn)總結(jié)淺談
指針是C語(yǔ)言的難點(diǎn)和重點(diǎn),但指針也是C語(yǔ)言的靈魂 。2013-03-03
C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明
這篇文章主要介紹了C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
C++實(shí)現(xiàn)LeetCode(6.字型轉(zhuǎn)換字符串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(6.字型轉(zhuǎn)換字符串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之Hello World源碼分析,接上一篇內(nèi)容,本文著重分析源碼文件,需要的朋友可以參考下2014-09-09
C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
c語(yǔ)言同名標(biāo)靶點(diǎn)自動(dòng)匹配算法實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了c語(yǔ)言同名標(biāo)靶點(diǎn)自動(dòng)匹配算法實(shí)現(xiàn)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
C語(yǔ)言實(shí)現(xiàn)通訊錄系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

