C 學習之 虛函式

2021-08-20 09:56:23 字數 1350 閱讀 9753

靜態聯編

運算子過載

過載函式是通過「名字壓延」方法來實現。即在編譯時將函式名和引數結合起來創造乙個新的函式名,用新的名字替換原有名字。

執行時多型性虛函式是在類定義中的函式原型宣告前加乙個關鍵字virtual。在派生類中重新定義時,它的函式原型(包括返回型別,函式名,引數個數和引數型別)必須與基類中的虛函式完全相同,否則編譯器會認為派生類有兩個過載函式。

當把乙個函式定義為虛函式時,等於告訴編譯器,這個成員函式在派生類中可能有不同的實現。必須在執行時根據傳遞的引數來決定呼叫哪乙個函式。

派生類在對基類的虛函式重定義時,關鍵字virtual可以寫也可以不寫。不管virtual寫或者不寫,該函式都被認為是虛函式。但最好是在重定義時寫上virtual。

建構函式不能是虛函式,但析構函式可以是虛函式,而且最好是虛函式

如果派生類新增加的資料成員中含有指標,指向動態申請的記憶體,那麼派生類必須定義析構函式釋放這部分空間。但如果派生類的物件是通過基類的指標操作的,則delete基類指標指向的物件就會造成記憶體洩漏。使用虛析構函式就可以解決記憶體洩漏的問題。

和其他的虛函式一樣,析構函式的虛函式的性質將被繼承。派生類的析構函式在執行時會自動呼叫基類的析構函式,因此基類和派生類的析構函式都被執行,這樣就把派生類的物件完全析構,而不是只析構派生類中的基類部分了。

如果繼承層次樹中的根類的析構函式是虛函式的話,所有派生類的析構函式都將是虛函式。

純虛函式:是乙個在基類中說明的虛函式,它在該基類中沒有定義,但要在它的派生類裡定義自己的版本,或重新說明為純虛函式

純虛函式的一般形式

virtual 型別 函式名(參數列)=0

class shape

virtual

double area() = 0;

virtual

void display()

};

如果乙個類中至少有乙個純虛函式,則該類被稱為抽象類

抽象類只能作為其他類的基類,不能建立抽象類的物件。因為一旦對此物件呼叫純虛函式,該函式將無法執行。但是可以宣告指向抽象類的指標或引用,此指標可指向它的派生類,進而實現多型性

抽象類不能用作引數型別、函式返回型別或顯式轉換型別

如果派生類中給除了基類所有純虛函式的實現,則該派生類不再是抽象類,否則仍為抽象類

抽象類的意義:

1.作為基類,實現執行時的多型性.

2.保證進入繼承層次的每個類都具有純虛函式所要求的行為,這保證了圍繞這個繼承層次所建立起來的軟體系統能正常執行,避免了這個繼承層次的使用者由於偶爾的失誤(忘了為它所建立的派生類提供繼承層次所要求的行為)而影響系統正常執行。

C 學習筆記之虛函式

虛函式即在父類中成員函式錢加上virtual關鍵字,使得該成員函式具有動態鏈結屬性 因此函式具有了多型性 那麼什麼是動態鏈結呢?即程式在編譯階段不能確切知道將要呼叫的函式,只有在程式執行時才能確定將要呼叫的函式,要確切的知道呼叫的函式,要求聯編工作要在程式執行時進行,這種程式執行時進行的聯編稱之為動...

C 學習筆記之虛函式

1.聯編是電腦程式彼此關聯的過程,這個過程需要確定函式呼叫和執行函式呼叫的 之間的對映關係,按照聯編的不同階段,可以分為靜態聯編和動態聯編 2.靜態聯編 就是在程式執行之間執行的早期聯編,那麼在程式執行時就會按照靜態聯編的結果進行執行,這也就是為什麼一直執行的時父類的func,也就是說如果父類和子類...

C 之虛函式

若乙個例項方法宣告前帶有virtual關鍵字,那麼這個方法就是虛方法。虛方法與非虛方法的最大不同是,虛方法的實現可以由派生類所取代,這種取代是通過方法的重寫實現的 以後再講 虛方法的特點 虛方法前不允許有static,abstract,或override修飾符 虛方法不能是私有的,因此不能使用pri...