虛函式中靜態型別與動態型別

2021-07-31 08:42:24 字數 1024 閱讀 7565

子類中含有父類的介面,所以在任何需要基類指標或引用的地方,我們都可以為其提供乙個派生類的指標或引用。在任何需要基類副本的地方,我們也可以為其提供乙個派生類。但是指標和引用的地方是動態型別,而副本的地方是靜態型別。

表示式的靜態型別在編譯時總是已知的,而動態型別則是變數或表示式表示的記憶體中的物件的型別(乙個變數表示的記憶體中的物件型別可能不唯一)。動態型別直到執行時才可知。

如 father item1;//基類物件

son   item2;//派生類物件

father* ptr=&item1;//ptr指向基類物件

ptr=&item2;//ptr指向派生類中的基類部分

father & a=son;//a繫結到派生類中的基類部分

2.派生類中被宣告為虛函式的函式會重寫基類中被宣告為虛函式的同名函式。

考慮如下**:

#include

using namespace std;

class father

};class son :public father

};int hey(father&);

int main()

int hey(father& a)

輸出為2,2。因為重名函式被宣告為虛函式,所以基類中的被抹去重寫。如果沒有被宣告為虛函式,輸出為1,1 。而且如果函式形參為father而不是引用,輸出2,1 。

原理是不是很亂?我們可以這樣理解:

1.所有需要基類指標和引用的地方我們都可以用派生類的指標和引用來代替,此時為動態型別,也就相當於傳入了乙個派生類,那麼自然呼叫派生類中的虛函式。

如果函式重名但並未被宣告虛函式,那麼呼叫基類中的重名函式。值得注意的是,如果此時直接呼叫,呼叫的是派生類中的重名函式。

2.所有需要基類副本的地方都可以用派生類來代替,此時為靜態型別,呼叫的永遠都是基類。

3.存在派生類指標或引用向基類的指標或引用的轉換,但不存在基類的指標或引用向派生類指標或引用的轉換。乙個派生類的指標不能指向乙個基類,而乙個基類的指標可以指向乙個派生類,此時該基類指標的動態型別為派生類指標。

靜態型別與動態型別

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤,需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...

動態型別語言與靜態型別語言

在程式執行期間才做型別檢查的語言。在編寫程式時,不需要給變數指定型別。在程式執行時,給變數賦第乙個值時確定變數的資料型別。動態語言型別優點 1.簡潔,且程式設計師可以專注於本質設計,大大提公升開發效率。動態語言的缺點 1.程式執行速度慢,因為型別檢查是在執行時做的。2.不執行就發現不了型別錯誤問題。...

強型別與弱型別,靜態型別和動態型別

首先強弱是相對的。強型別 每個變數和物件都必須宣告型別,在編譯時確定好型別了,執行時不能更改。偏向於不容忍隱式型別轉換。譬如說haskell的int就不能變成double。弱型別 編譯時不確定型別,執行時根據語義確定是哪種型別。通俗地說,弱型別偏向於容忍隱式轉換,把不同型別的變數放在一起運算。靜態型...