C 關於虛函式

2021-05-25 23:34:17 字數 1002 閱讀 6576

兩者區別在於,虛函式總能呼叫到正確的,即根據當前型別來呼叫;而new並不是這樣。

1.  採用了virtual宣告的函式(虛函式)子類重寫的時候會呼叫子類物件的方法

因此在通過基類進行轉化的時候,虛函式會根據物件真正型別,而呼叫相應的函式;

例如:

a   obja   =   new   b();

obja.dosomething();//call   b::dosomething   method,   not   a::dosomething  

2.沒宣告為虛函式

而對於new來說,函式的呼叫不會產生多型,會根據定義型別而進行呼叫

例如:

a   obja   =   new   b();

obja.dosomething();//call   a::dosomething   method,   not   b::dosomething  

因此前者屬於多型,屬於後繫結,需要在執行的時候才能知道呼叫的是哪個型別方法;而後者屬於靜態繫結,在編譯的時候已經確定了呼叫的型別方法。

如果還沒明白請看一下**

class 虛方法

}public class a

public virtual string gettyep2()

}public class b : a   //b繼承自a

public new string gettype()

//前面兩種方式 隱藏基類的gettype方法是一樣的效果,但是第一種方法編譯器會有乙個警告 提示你是否有意隱藏基類的方法

public override string gettyep2()

}輸出結果: a bb

從上面可以看出 宣告虛函式 子類重寫該方法 用子類去例項化父類的時候 呼叫的會是子類相應的方法。

其次的 如果父類方法沒有用virtual來修飾則 子類不可以用override 來重寫該方法 只可以用new關鍵字來隱藏父類的方法,或者什麼都不加也可以。但最後面一種情況編譯器會給與乙個警告。

關於C 虛函式 純虛函式

1.虛函式與純虛函式的區別 答 定義乙個函式為虛函式,不代表函式為不被實現的函式,定義它為虛函式是為了允許用基類的指標來呼叫子類的這個函式 定義乙個函式為純虛函式,才代表函式沒有被實現,定義他是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。2.基類中定義的虛函式,...

關於虛函式

虛函式的作用是實現 動態聯編 也就是在程式的執行階段動態地選擇合適的 成員函式 在定義了虛函式後,可以在基類的 派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的 形參個數和形參型別。以實現統一的介面,不同定義過程。如果在 派生類中沒有對虛函式重新定義,則它繼承其 基類的虛函式 ...

關於虛函式

1.int aobj 得到了虛函式表指標的位址 vptr 2.int int aobj 得到虛函式表指標vptr 指標的型別是 int 這時需要轉化下 3.vptr是指向vptr table,其實就是指向乙個陣列,陣列元素是函式指標。int int aobj 指向陣列第乙個元素 所以 int int...