溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++重載,覆蓋和隱藏區(qū)別

發(fā)布時(shí)間:2020-07-28 09:38:22 來(lái)源:網(wǎng)絡(luò) 閱讀:401 作者:小止1995 欄目:編程語(yǔ)言

 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é)果:

C++重載,覆蓋和隱藏區(qū)別

還有一點(diǎn)要切忌,對(duì)于static這種靜態(tài)成員函數(shù),是屬于類的方法,而不是對(duì)象的方法,所

以static方法絕對(duì)不能被覆蓋或者隱藏。


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI