隱藏函式與虛函式

2021-06-02 23:12:55 字數 2338 閱讀 4074

(1)概述

如果要隱藏函式,要使用new關鍵字;如果要重寫(覆蓋)虛函式,要使用virtual和override關鍵字。

然後講一下什麼是申明類和例項類。舉個例子: bird b = new magpie();

bird類就是申明類,而magpie就是例項類。

接下來講一下呼叫某個物件的函式的基本規律。該方法可以結合以下幾節的例項具體運用。

1、當呼叫乙個物件的函式時,系統會直接去檢查這個物件的申明類,看所呼叫的函式是否為虛函式;

2、如果不是虛函式,那麼它就直接執行該函式。而如果有virtual關鍵字,也就是乙個虛函式,那麼這個時候它就不會立刻執行該函式了,而是轉去檢查物件的例項類。

3、在這個例項類裡,他會檢查這個例項類的定義中是否有重新實現該虛函式(通過override關鍵字),如果是有,那麼ok,它就不會再找了,而馬上執行該例項類中的這個重新實現的函式。而如果沒有的話,系統就會不停地往上找例項類的父類,並對父類重複剛才在例項類裡的檢查,直到找到第乙個重寫了該虛函式的父類為止,然後執行該父類裡重寫後的函式。

該規律節選自

(2)隱藏函式:

class program

}class bird

}class magpie : bird

}

如果想在magpie類中定義自己的chirp()方法,也就是說隱藏基類中的同樣簽名的方法,就需要在派生類中定義相同簽名的方法。

但是這樣編譯器會出現乙個警告,提示如果有意去隱藏基類的方法,請使用new關鍵字修飾。

warning 1 'inheritancetest.magpie.chirp()' hides inherited member 'inheritancetest.bird.chirp()'. use the new keyword if hiding was intended.

所以正確的做法是

class magpie : bird

}

如果執行該程式,結合概述中的規律,在呼叫物件的方法時,檢視申明類的方法的宣告,如果不是虛函式,則直接執行申明類中的方法。

所以在上面那個例子中,輸出結果為

magpie ...

...只有第二次呼叫的時候使用的是magpie類作為申明類,所以只有第二次呼叫的是magpie.chirp()的方法

(3)虛函式

下面在bird.chirp()方法前加上virtual關鍵字,則該函式成為了虛函式。

class program

}class bird

}class magpie : bird

}

在以上的例子中,magpie類的定義方法會使編譯器發出警告,對magpie.chirp()方法或者使用new關鍵字,或者使用override關鍵字。

warning 1 'inheritancetest.magpie.chirp()' hides inherited member 'inheritancetest.bird.chirp()'. to make the current member override that implementation, add the override keyword. otherwise add the new keyword. 

下面我們使用new關鍵字來隱藏父類中的方法,然後看看輸出結果是什麼。

class magpie : bird

}

執行程式,輸出結果為:

magpie ...

...道理同我們在概述中一樣。申明類為bird時,雖然chirp()是虛函式,但是子類中並沒有重寫該函式,所以最後還是執行了bird.chirp()的方法。申明類為magpie時,就直接執行了magpie.chirp()的方法。

如果我們要使用override關鍵字,就表示我們要對父類中的虛函式重寫或者覆蓋。   

class magpie : bird

}

再執行程式,就會得到不同的結果:

magpie ...

magpie ...

具體原因請結合概述中的規律進行分析。

(4)下面做乙個練習

class program

}class animal

}class bird : animal

}class magpie : bird

class chicken : animal

}

輸出結果為:

animal move

bird move

bird move

animal move

chicken move

虛函式和純虛函式 覆蓋和隱藏

虛函式 virtual void breather cout annimal breather 從 中可以看出,虛函式有方法體。虛函式主要是c 的多型性,當編譯器編譯的時候,發現breather 是乙個虛函式,這時候c 就會才用遲繫結 late binding 技術。也就是編譯時不確定具體呼叫的函式...

虛函式與純虛函式

1 基本形式 virtual returntype function 1 虛函式宣告 virtual returntype function 2 0 純虛函式宣告 先講示例吧,再總結結論。2 示例 classanimail 這段 的輸出結果是什麼呢?起初我認為是 animail function 1...

虛函式與純虛函式

參考 虛函式 比如 virtual void function1 virtual關鍵字修飾的 成員函式 就是虛函式。把基類的成員函式 設為virtual,其 派生類的相應的函式也會自動變為虛函式。指向 基類的指標在操作它的 多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。純虛...