什麼是多型
多型就是在不同繼承關係的類物件,去呼叫同一函式,產生了不同的行為。
實現多型的條件
呼叫函式的物件是指標或引用。被呼叫函式必須是虛函式,並且完成了虛函式的重寫。
函式過載多型的作用
封裝是為了**模組化,繼承是擴充套件已存在的**,他們的目的都是為了 實現**的復用,但是多型的目的是為了實現介面的重用,也就是多不管傳遞過來的是哪個類物件,函式都能狗狗通過這個介面呼叫到適應自己物件的實現方法。
虛函式重寫:子類重寫父類的函式(協變:子類中的返回值和父類中的返回值是父子關係,並且是引用或指標)。如果只在父類中新增virtual關鍵字,子類中的重寫函式也會稱為虛函式,童謠可以構成多型,否則為重定義。
函式過載、重定義、重寫的區別:
函式的過載:在相同的作用域中,兩個函式的引數不同,函式名相同,構成函式過載。
函式重定義:子類中有父類的同名函式,繼承自父類的函式被隱藏,子類呼叫重寫後的。
函式的重寫:子類與父類的虛函式函式名、引數、返回值相同的函式,構成函式重寫。
虛函式和純虛函式
虛函式就是在類的成員函式錢錢新增了virtual關鍵字。主要是為了實現多型,通過一張虛函式表來實現。它允許子類重寫來自父類的成員函式。
純虛函式就是在基類中只對對應的虛函式進行宣告,在最後加=0,定義純虛函式的類是乙個抽象類,抽象類不能被例項化,它體現的是介面繼承,子類只是繼承了這個介面的形式,不需要使用他裡面的功能,要實現自己的功能。在子類中必須實現父類的純虛函式,如果不實現父類的純虛函式,這個子類也是乙個抽象類,同樣不能區例項化物件。
那麼什麼是抽象類呢?抽象類就是包含純虛函式的類,這個類不能被例項化,因為類定義的不完整,成員函式都沒有實現,這種類只是為了介面繼承的實現,繼承他的子類並不想去用它,子類要實現自己的功能。
無論是虛函式還是純虛函式,都是在基類中為派生類提供程式設計介面,物件導向最核心的思想就是對介面程式設計,而不是對實現程式設計,在c++中,就是使用繼承和多型來事項這種思想。如果想讓基類為派生類提供預設的處理方法,那麼就將這個函式設為虛函式,如果是想讓派生類必須重寫該虛函式,就將這個函式設為純虛函式。
1、虛函式和純虛函式可以定義在同乙個類中,一旦某個類包含了純虛函式,這個類就是乙個抽象類。虛函式表是乙個函式指標陣列,在末尾存放的時乙個空指標nullptr,在vs中存放在**段,在虛函式表中只存放虛函式執政,他不存放普通函式的指標,將新建立的虛函式指標存放在虛函式表末尾。2、虛函式可以直接被使用,但是純虛函式必須要在派生類中實現之後才可以使用,一i那位純虛函式在積累中只宣告沒有定義,所以無法直接使用。
3、虛函式和純虛函式都可以在子了中被重寫,一墮胎的形式被呼叫。
4、虛函式和純虛函式都是為了實現介面繼承而出現。
5、虛函式的定義:
virtual + 函式
純虛函式定義:virtual + 函式 + =0;
6、虛函式和純虛函式都不能設為static,因為static在編譯的時候就要被繫結,但是虛函式和純虛函式實在執行時在確定的。
虛標指標:存放在物件模型中,在32位機上,存放在物件模型的頭4個位元組中。
單繼承中的虛表
在單繼承中所有的虛函式都存放在虛表中,如果有被重寫的,直接將虛表中的虛函式指標換成重寫後的虛函式指標即可,如果在子類中的新增了新的虛函式,按照新的虛函式的宣告順序將其新增到虛表中。在虛表中,先新增父類的虛函式指標,再新增子類的虛函式指標。
多繼承中的虛表
#include
using
namespace std;
class
base1
virtual
void
func2()
private
:int b1;};
class
base2
virtual
void
func2()
private
:int b2;};
class
derive
:public base1,
public base2
virtual
void
func3()
private
:int d1;};
typedef
void
(*vfptr)()
;//函式指標
void
printfunc
(vfptr* vftable)
}int
main()
普通函式的繼承就是一種實現繼承,派生類繼承了基類函式,繼承的是函式的實現。
虛函式的繼承是介面繼承,派生類繼承的是基類函式的介面,目的是為了重寫,從而達成多型,繼承的是介面。如果不是為了實現多型,不要把函式設為虛函式。
C 多型之常見面試題
答 多型是在不同繼承關係的類物件,去呼叫同一函式,產生了不同的行為。通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的物件去完成時會產生出不同的狀態。答 c 中不能進行函式過載的操作符 sizeof 和 答 虛函式表。答 不能,因為靜態成員函式沒有this指標,使用型別 成員函式的呼叫方式無...
C 常見面試題
1.c中static有什麼作用 1 隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,故使用static在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。2 static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就...
C常見面試題
1.bool型別,值為true或flase 正確答案 bool flag if flag if flag 以下均為不良風格 if flag true if flag 1 if flag false if flag 0 2.char 3.int int x if x 0 if x 0 4.float ...