C 父類與子類關係以及函式過載 覆蓋和隱藏規則

2021-06-29 13:00:49 字數 1903 閱讀 5732

今天去htc面試,筆試考了邏輯、c語言、c++語言幾個部分,c/c++考的全是基本語法,沒有考演算法。c語言部分做的還不錯,c++部分卻做的那麼多不確定,其中大部分是c++父子類之間關係以及函式過載、覆蓋以及隱藏規則。

在c++語言中,虛函式是非常重要的概念,虛函式是實現c++物件導向中多型性和繼承性的基石。而多型性和繼承性則是物件導向語言的精髓。掌握虛函式才算是真正掌握c++語言,而c++語言中虛函式的繼承覆蓋與函式過載有些類似,很多初學者搞不清他們之間的關係。

首先要明確覆蓋(override)與過載(overload)的定義,區別出什麼是覆蓋和過載:

覆蓋就是派生類中虛成員函式覆蓋基類中同名且引數相同的成員函式。

如下例:

[cpp]view plain

copy

class

cbase  

;  class

cderiveda : 

public

cbase  

;  int

main()    

上例中,cderived和cbase之間就是函式覆蓋關係,walk和jump函式被派生類覆蓋,輸出肯定是派生類函式的輸出。下面就這幾者關係著重學習。再看看下例:

[cpp]view plain

copy

class

cbase  

;  class

cderiveda : 

public

cbase  

;  int

main()    

這裡基類中run與派生類中run函式就是過載(overload)關係,當使用基類

來呼叫派生類物件中過載函式,會根據其作用域來判斷,如基類cbase,其作用域就是cba

se這個類的大括

號包含的內容,派生

類cderiverda其作用域就是cderiveda大括號中包含的內容。因此在使用基類呼叫派生類物件中的run方法時,會執行基類的run方法。

關於作用域可見性規則(摘於網上:如下:

如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。

在類的派生層次結構中,基類的成員和派生類新增的成員都具有類作用域。二者的作用範圍不同,是相互包含的兩個層,派生類在內層。這時,如果派生類宣告了乙個和某個基類成員同名的新成員,派生的新成員就隱藏了外層同名成員,直接使用成員名只能訪問到派生類的成員。如果派生類中宣告了與基類同名的新函式,即使函式的參數列不同,從基類繼承的同名函式的所有過載形式也都被隱藏。如果要訪問被隱藏的成員,就需要使用類作用域分辨符和基類名來限定。

根據上面的解釋,cbase類處於作用域的外層,因此派生類的方法對於其將是不可見的,即隱藏的。而在派生類中,如果有過載函式時,基類函式將會被隱藏,否則基類函式就不被隱藏。

函式過載和虛函式都能實現物件的多型特性,但是函式過載只能實現靜態的多型,也就是在編譯時多型,即編譯器會給過載的函式在編譯時加上不同的字首,是函式名在執行時不同。而虛函式可以實現動態多型,即執行時多型,但是虛函式實現需要增加額外的虛函式指標等,會增加相應空間。

再看下例:

[cpp]view plain

copy

class

cbase  

;  class

cderiveda : 

public

cbase  

;  int

main()    

以上**就可以看出,派生類中的過載方法,在基類是不能呼叫的,編譯的時候就會出錯。

c++中實現多型的三種方式:

模板、函式過載、虛函式。

C 父類與子類的關係

這裡,我做乙個整合。這裡前期要極其注意修飾符之間的關係。1.main呼叫方法,其實我也不知道叫什麼,大家看 吧。using system using system.collections.generic using system.linq using system.text using system...

C 子類父類建構函式的關係

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承 子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅...

子類與父類建構函式的執行關係

對引用1中的 做了部分修改,同時借鑑引用2的結論。public abstract class myclass public static void main string args public abstract void initvalue public void show class man e...