我可以給你說說我的理解
我認為隱藏和覆蓋的區別主要體現在 多型上
舉個例子
隱藏和覆蓋
#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 覆蓋和隱藏
指的是 子類繼承父類屬性 函式 並且自身也有與父類同名的屬性 函式 這是編譯器就會在子類中對父類屬性做乙個隱藏,我們並不能通過子類物件直接點出父類相關屬性或函式,必須要在特定位置上加上父類作用域才可以。指的是 子類繼承父類虛函式,並且對其重寫,這時,我們用乙個父類指標來接收子類物件位址。並通過這個父...