1. 程式人生 > >C#中子類對父類中虛方法的處理有重寫(override)和覆蓋(new),他們有什麼區別?

C#中子類對父類中虛方法的處理有重寫(override)和覆蓋(new),他們有什麼區別?

在子類中用override重寫父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法;

如果子類中用new覆蓋父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法;

示例程式碼:

   /// <summary>
    /// 父類
    /// </summary>
    public class ParentClass
    {
        public virtual void ParVirMethod()
        {
            Console.WriteLine("父類的方法...");
        }
    }

    /// <summary>
    /// 子類1
    /// </summary>
    public class ChildClass1 : ParentClass
    {
        public override void ParVirMethod()
        {
            Console.WriteLine("子類1的方法...");
        }
    }

    /// <summary>
    /// 子類2
    /// </summary>
    public class ChildClass2 : ParentClass
    {
        public new void ParVirMethod()
        {
            Console.WriteLine("子類2的方法...");
        }

        public void Test()
        {
            Console.WriteLine("子類2的其他方法...");
        }
    }
執行呼叫:
            ParentClass par = new ChildClass1();
            par.ParVirMethod(); //結果:“子類1的方法”,呼叫子類的方法,實現了多型

            par = new ChildClass2();
            par.ParVirMethod();//結果:“父類的方法”,呼叫父類的方法,沒有實現多型            


結果:

子類1的方法...

父類的方法...



相關推薦

C#中子方法處理重寫override覆蓋new他們什麼區別

在子類中用override重寫父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法; 如果子類中用new覆蓋父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法; 示例程式碼: /// <

的屬性字段的改寫

override class string tel 保護 static 解釋 oid 父類 子類對父類中的屬性和字段的改寫 剛開始聽老師講,字段要用private來修飾,屬性用public來修飾,通過屬性來控制字段,字段存儲數據。 那為什麽要用private來修飾字段呢

的調用主要是參數方法調用

繼承 bsp pri load china 類的方法 調用父類 class sub #子類調用父類的方法 class Vehichle: Country=‘china‘ #名字=‘ales‘不好這樣 def __init__(self,name,s

C#重寫override覆蓋new區別

實現 div del end 抽象方法 ring reg strong AR 重寫 用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。重寫會改變父類方法的功能。

c++函式過載overload覆蓋override

過載(overload) 函式名相同,引數型別、數量、順序、返回型別中有一個以上不同: int add(int a, int b){return a + b;} double add(double a, double b) {return a + b;} //過載add函式 覆

C# 利用反射更改公開

保存數據 圖片 OS item src [] getprop AR .net 需求 : 有一個保存數據庫字段的基礎類,現在要加個狀態返回給前端,但是又不能改基礎類; class BaseA { public string Name { get; set;

C++中子呼叫參建構函式

 轉自:https://blog.csdn.net/sddyljsx/article/details/9156055 參考: https://blog.csdn.net/qq_36846891/article/details/69666437 //java中子類構造與父類

C++的預設建構函式初始化列表呼叫建構函式

預設建構函式:未提供顯式初始值時,用來建立物件的建構函式。 class testClass { public:     testClass();               

C++派生成員的三種訪問規則

、公有繼承的訪問規則當類的繼承方式為公有繼承時,基類的public成員和protected成員被繼承到派生類中仍作為派生類的public成員和protected成員,派生類的其它成員可以直接訪問它們。但是,類的外部使用者只能通過派生類的物件訪問繼承來的public成員。基類的private成員在私有派生類中是

java 中子如何實現私有域的繼承

 父類中的公有方法和域(屬性),在類繼承中將會被子類繼承,但是私有的將不能被繼承。 那麼在繼承中子類如何才能繼承到父類的私有域呢? 答案是:在子類的構造方法中通過super()方法呼叫父類的構造方法。 也就是,在構造子類的同時,為子類構造出跟父類相同的域。如此就在子類的物件

Java 子繼承成員的問題

subclass 情況 討論 就會 之前 測試 public 測試結果 string   之前搞錯了,變量沒有“重寫”一說,只有方法才能被“重寫”。如果我們在子類中聲明了一個和父類中一樣的變量,那麽實際的情況是,子類的內存堆中會有類型和名字都相同的兩個變量。   現在考慮一

繼承的構造器

gen 向上轉型 類構造 復制 使用 article col 成員 ring 子類繼承父類,子類構造器會默認調用super()(無論構造器中是否寫有super()),用於初始化父類成員.同時當父類中存在有參構造器時,必須提供無參構造器,子類構造器中並不會自動繼承有參構造器,

C++ 學習筆記 繼承- 子同名函數變量

pan end main函數 類繼承 class 分享圖片 共享 code 訪問   學習了類的繼承,今天說一下當父類與子類中有同名函數和變量時那麽程序將怎麽執行。首先明確當基類和子類有同名函數或者變量時,子類依然從父類繼承。   舉例說明:         例

Java子靜態程式碼塊、非靜態程式碼塊、建構函式的執行順序一覽表

子類Child繼承父類Parent Child child=new Child(); 執行順序如下: ①父類靜態程式碼塊>>②子類靜態程式碼塊>>③父類非靜態程式碼塊>>④父類建構函式>>⑤子類非靜態程式碼塊>>⑥子類

java中子繼承程式執行順序問題

測試程式碼: package test; public class FatherTest { private String name; public FatherTest(){ System.out.println("--父類的無參建構函式--"); } public

c++子繼承函式呼叫特性原理以及與java的對比

c++ c++中子類繼承了父類,子類物件的函式和變數會接著新增在父類物件的記憶體後面,以此類推。。。 如果c++中父類的那個變數或者函式宣告為virtual虛擬函式,那麼子類物件的同名函式就直接覆蓋了(即在記憶體中真正的覆蓋,父類的這個函式已經不在了)父類物件的這個函式 如

c# 子改變資訊的問題兩個窗體傳值的問題

固定一個窗體在另一個窗體中首先需要設定父窗體IsMdiContainer屬性為True,然後在Load事件中加入以下語句: NewContact newConFrm = new NewContact(this); newConFrm.NewGroup = CreateGroup;

Python中子呼叫的初始化方法

轉自:https://blog.csdn.net/feishicheng/article/details/79596000 Python中子類呼叫父類的初始化方法 前言 python中進行面向物件程式設計,當在子類的例項中呼叫父類的屬性時,由於子類的__init__方法重寫了父類的__init_

Java中子的構造方法

子類與父類的構造方法有兩點原則: 1、子類的構造方法必須呼叫父類的構造方法(原因為什麼,可參考此連結https://blog.csdn.net/y_dzaichirou/article/details/54920715) 2、被子類呼叫的父類構造方法必須存在(這

C++ boost庫子之間去掉頂層const動態轉換

template<class _Ty1, class _Ty2> shared_ptr<_Ty1> static_pointer_cast(const shared_ptr<_Ty2>& _Other) { // return