在c++語言中,虛函式是非常重要的概念,虛函式是實現c++物件導向中多型性和繼承性的基石。而多型性和繼承性則是物件導向語言的精髓。掌握虛函式才算是真正掌握c++語言,而c++語言中虛函式的繼承覆蓋與函式過載有些類似,很多初學者搞不清他們之間的關係。
首先要明確覆蓋(override)與過載(overload)的定義,區別出什麼是覆蓋和過載:
覆蓋就是派生類中虛成員函式覆蓋基類中同名且引數相同的成員函式。
如下例:
classcbase
virtual
void jump()
};class cderiveda : public
cbase
void jump()
};int
main()
上例中,cderived和cbase之間就是函式覆蓋關係,walk和jump函式被派生類覆蓋,輸出肯定是派生類函式的輸出。下面就這幾者關係著重學習。再看看下例:
classcbase
virtual
void jump()
void run(int speed)
};class cderiveda : public
cbase
void jump()
void run(int speed)
};int
main()
這裡基類中run與派生類中run函式就是過載(overload)關係,當使用基類來呼叫派生類物件中過載函式,會根據其作用域來判斷,如基類cbase,其作用域就是cbase這個類的大括號包含的內容,派生類cderiverda其作用域就是cderiveda大括號中包含的內容。因此在使用基類呼叫派生類物件中的run方法時,會執行基類的run方法。
關於作用域可見性規則(摘於網上:如下:
如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。
在類的派生層次結構中,基類的成員和派生類新增的成員都具有類作用域。二者的作用範圍不同,是相互包含的兩個層,派生類在內層。這時,如果派生類宣告了乙個和某個基類成員同名的新成員,派生的新成員就隱藏了外層同名成員,直接使用成員名只能訪問到派生類的成員。如果派生類中宣告了與基類同名的新函式,即使函式的參數列不同,從基類繼承的同名函式的所有過載形式也都被隱藏。如果要訪問被隱藏的成員,就需要使用類作用域分辨符和基類名來限定。
根據上面的解釋,cbase類處於作用域的外層,因此派生類的方法對於其將是不可見的,即隱藏的。而在派生類中,如果有過載函式時,基類函式將會被隱藏,否則基類函式就不被隱藏。
函式過載和虛函式都能實現物件的多型特性,但是函式過載只能實現靜態的多型,也就是在編譯時多型,即編譯器會給過載的函式在編譯時加上不同的字首,是函式名在執行時不同。而虛函式可以實現動態多型,即執行時多型,但是虛函式實現需要增加額外的虛函式指標等,會增加相應空間。
再看下例:
classcbase
virtual
void jump()
void run(int speed)
};class cderiveda : public
cbase
void jump()
void run(int speed)
void run(int speed,int direction)
};int
main()
以上**就可以看出,派生類中的過載方法,在基類是不能呼叫的,編譯的時候就會出錯。
C 虛函式覆蓋 過載
cbase類處於作用域的外層,派生類的方法對於其將是不可見的,即隱藏的。而在派生類中,如果有過載函式時,基類函式將會被隱藏,否則基類函式就不被隱藏。includeusing namespace std 基類 class cbase virtual void jump void run int spe...
C 虛函式 過載與覆蓋 虛繼承
1.什麼是虛函式 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現一共同的方法,但因個體差異而採用不同的策略。虛函式主要通過虛函式表 v table 來實現...
C 基礎(五)虛函式 過載 覆蓋 隱藏
虛函式總是跟多型聯絡在一起,引入虛函式可以使用基類指針對繼承類物件進行操作!虛函式 繼承介面 函式名,引數,返回值 但是實現不繼承 函式體 非虛函式 繼承介面,也繼承實現 1 虛析構函式 當乙個類打算作為基類使用時候,其析構函式必須是虛函式 建構函式可以為虛函式嗎?不可以,在生成物件的時候,必須向編...