隱藏和覆蓋 C

2021-06-27 20:53:26 字數 2634 閱讀 8602

我可以給你說說我的理解  

我認為隱藏和覆蓋的區別主要體現在  多型上

舉個例子

隱藏和覆蓋

#include

#include

using namespace std;

class a

void f();

class b:public a

virtual void g();

int main()

結果是 a a

b    

invoke bbb 

invoke aaa

invoke bbb

我想說的是  如果是隱藏的話  當你通過指標呼叫這個函式的時候,呼叫根據的是指標的型別

如果是覆蓋的話  當你通過指標呼叫這個函式的時候,根據的是指標指向的型別

這就是我的理解  希望對你有用

這涉及到多型的問題。

比如說你有乙個基類base,有乙個派生類derived繼承自base

兩個類都有乙個叫做fun的方法

然後你建立乙個子類物件,但是用父類的指標(或者引用)指向他

例如:base *b = new derived();

如果你不加virtual

那麼b.fun()呼叫的是父類的fun。因為b是父類指標,只能呼叫父類的方法,呼叫不到子類的方法。

如果你加上virtual

那麼b.fun()呼叫的是子類的fun。因為加了virtual之後,會產生乙個虛表,將fun函式放入虛表之內。當建立乙個子類物件時,會自動「覆蓋」父類的fun函式(你暫時這麼理解就行)。b.fun()呼叫的是子類覆蓋之後的fun函式。

也就是說,不加virtual,你的子類物件會有兩個fun函式,乙個父類的,乙個子類的。

如果你加上virtual,你的子類只有乙個fun函式,就是父類的fun函式。

簡單說一下多型的作用吧。

比如說atm,你要插借記卡,信用卡,visa之類的,各種各樣的銀行卡。這些卡都是銀行卡,所以銀行卡是父類。而各種各樣的卡是子類。

當atm要取錢的時候,他不需要為每一種卡都寫乙個函式 借記卡.getmoney(),信用卡.getmoney()。

有了多型之後,他只需要寫乙個 銀行卡的getmoney()函式就行了,將這個函式設定為virtual。多型的意義就是能夠用父類指標來指向子類物件。而不同種類的卡(子類)只需要實現自己的getmoney().當使用銀行卡呼叫getmoney函式時,程式會因為多型性,自動尋找子類的getmoney函式執行。

非常方便。

父類子類指標函式呼叫注意事項

1,如果以乙個基礎類指標指向乙個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(

靜態聯翩)

2,如果以乙個衍生類指標指向乙個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾。(一般不會這麼去定義)

3,如果基礎類和衍生類定義了相同名稱的成員函式,那麼通過物件指標呼叫成員函式時,到底呼叫那個函式

要根據指標的原型來確定,而不是根據指標實際指向的物件型別確定。

虛函式就是為了對「如果你以乙個基礎類指標指向乙個衍生類物件,那麼通過該指標,你只能訪問基礎類定義的成員函式」這條規則反其道而行之的設計。

如果你預期衍生類由可能重新定義乙個成員函式,那麼你就把它定義成虛函式( virtual )。

polymorphism就是讓處理基礎類別物件的程式**能夠通透的繼續適當地處理衍生類物件。

純虛函式:

virtual void myfunc ( ) =0;

純虛函式不許定義其具體動作,它的存在只是為了在衍生類鐘被重新定義。

只要是擁有純虛函式的類,就是抽象類,它們是不能夠被例項化的(

只能被繼承)。

如果乙個繼承類沒有改寫父類中的純虛函式,那麼他也是抽象類,也不能被例項化。

抽象類不能被例項化,不過我們可以擁有指向抽象類的指標,以便於操縱各個衍生類。

虛函式衍生下去仍然是虛函式,而且還可以省略掉關鍵字「virtual」。

看個例子:

#include 

<

iostream

>

using

namespace

std; 

classa  

virtual

void

bar() 

}; class

b: publica  

void

bar() 

}; intmain() 

aptr->foo()輸出結果是:

b's foo()//這個明白,多型性

a's foo()//這個也明白,執行a::foo();

b's bar()//

雖然呼叫的是這個函式:a::foo(); 但隱式傳入的還是bobj 的位址,所以再次呼叫bar();呼叫時還是會呼叫b的函式, 與虛函式指標有關

aobj.foo()輸出結果是:

a's foo() //

這個不是指標,aobj完全是乙個a的物件,與多型沒有關係

a's bar() 

C 覆蓋和隱藏

class people virtual void getname different params 隱藏規則2 1 函式名相同 引數相同 2 無virtual void getphone same params 覆蓋規則 1 函式名相同 引數相同 2 有virtual virtual void g...

C 隱藏和覆蓋

1 在c 裡面,只有宣告vitual abstract和帶override的方法能夠被子類重寫 override 2 如果父類方法沒有以上關鍵字,子類又有和父類一樣的方法,那麼,就預設隱藏父類方法,這時候在命名空間後面要加new關鍵字 public newint sayhello 如果不加new關鍵...

C 覆蓋和隱藏

指的是 子類繼承父類屬性 函式 並且自身也有與父類同名的屬性 函式 這是編譯器就會在子類中對父類屬性做乙個隱藏,我們並不能通過子類物件直接點出父類相關屬性或函式,必須要在特定位置上加上父類作用域才可以。指的是 子類繼承父類虛函式,並且對其重寫,這時,我們用乙個父類指標來接收子類物件位址。並通過這個父...