您好,登錄后才能下訂單哦!
a.成員函數(shù)被重載的特征:
(1)相同的范圍(在同一個(gè)類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關(guān)鍵字可有可無(wú)。
因?yàn)楹瘮?shù)參數(shù)不同,可以簡(jiǎn)單的理解為:兩個(gè)重載函數(shù)是不同的函數(shù),調(diào)用者能夠明確
的根據(jù)不同的參數(shù)來(lái)調(diào)用不同的函數(shù)。那么如果存在這樣兩個(gè)函數(shù),編譯器怎么處理呢?
class A
{
public:
void Func(int a, int b=0) {printf("This is Func1/n");}
void Func(int a) {printf("This is Func2/n");}
};
int main()
{
A a;
a.Func(5);
return 0;
}
當(dāng)然,對(duì)于這樣兩個(gè)函數(shù),調(diào)用者不知道應(yīng)該調(diào)用哪個(gè)函數(shù),故編譯器直接報(bào)錯(cuò)。
我們?cè)诳纯?,覆蓋和隱藏分別是什么特性呢?從字面意思來(lái)講,覆蓋和隱藏都具有一個(gè)把另
一個(gè)給遮住了,那只不過(guò)是誰(shuí)遮誰(shuí)的問(wèn)題。
b.覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual 關(guān)鍵字。
我們發(fā)現(xiàn),這里用到了虛函數(shù),實(shí)際上虛函數(shù)的作用,就是實(shí)現(xiàn)覆蓋。
c.“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒(méi)有virtual 關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆)
請(qǐng)參看如下實(shí)例:
#pragma once #include<iostream> using namespace std; class Base { public: virtual void f(float x){ cout << "Base::f(float) " << x << endl; } void g(float x){ cout << "Base::g(float) " << x << endl; } void h(float x){ cout << "Base::h(float) " << x << endl; } }; class Derived : public Base { public: virtual void f(float x){ cout << "Derived::f(float) " << x << endl; } void g(int x){ cout << "Derived::g(int) " << x << endl; } void h(float x){ cout << "Derived::h(float) " << x << endl; } }; void Test1() { Derived d; Base *pb = &d; Derived *pd = &d; pb->f(3.14f); pd->f(3.14f); pb->g(3.14f); pd->g(3.14f); pb->h(3.14f); pd->h(3.14f); }
運(yùn)行結(jié)果:
還有一點(diǎn)要切忌,對(duì)于static這種靜態(tài)成員函數(shù),是屬于類的方法,而不是對(duì)象的方法,所
以static方法絕對(duì)不能被覆蓋或者隱藏。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。