A. C++中,子類對基類的某一個方法進行了重寫,
子類中還有,不過被屏蔽了。得用DerivedClass.BaseClass::function();的形式來調用。
#include<iostream>
usingnamespacestd;
classBase{
public:
voidtest(){
cout<<"Base"<<endl;
}
};
classDerived:publicBase{
public:
voidtest(){
cout<<"Derived"<<endl;
}
};
intmain(){
Derivedd;
d.test();
d.Base::test();
return0;
}
//Output
Derived
Base
B. C# 基類和派生類 方法重寫
這代碼就亂七八糟,沒法知道結果
只能簡單說明下方法修飾符override 和 new的區別
override : 主要是針對父類定義的虛方法virtua,表示自己只是一種基本實現,多數子類需要根據自己的情況重載;
new : 這種情況是父類已經定義好了實現,而且基本上是通用的,但是某個子類需要特殊處理,就顯式的覆蓋父類方法,你寫個同名方法,new不加也是一樣的,編譯會提示;
兩個都會使用子類的方法替換父類方法。
你自己體會一下它們的含義和目的,代碼結果一目瞭然。
C. 如何重寫基類方法 C#
把新的DataGridView放到form里相當於實例化了一個,你對一個實例重寫什麼啊。。。
D. c# 怎麼重寫基類的構造函數和虛擬方法
1、重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的,即方法名,參數,返回值都相同。
例如:基類方法聲明為virtual(虛方法),派生類中使用override申明此方法的重寫.
namespace 方法重寫
{
class Program
{
static voidMain(string[] args)
{
BaseClass CO =new ClassOverride();
CO.SetName("Override");
}
//基類
public classBaseClass
{
public virtualvoid SetName(string name)
{
Console.WriteLine("基類:我的名字是" + name);
}
}
//派生類
public classClassOverride : BaseClass
{
publicoverride void SetName(string name)
{
Console.WriteLine("Override:我的名字是" + name);
}
}
}
}
2、重寫override一般用於介面實現和繼承類的方法改寫,要注意:
1)覆蓋的方法的標志必須要和被覆蓋的方法的名字和參數完全匹配,才能達到覆蓋的效果。
2)覆蓋的方法的返回值必須和被覆蓋的方法的返回一致。
3)覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類。
4)被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
3、虛方法和抽象方法的區別
1)虛方法有一個實現部分可以被子類繼承,從而使子類獲得和基類相同的方法,另外也為派生類提供了覆蓋該方法的選項。相反,抽象方法沒有提供實現部分,是一種強制派生類覆蓋的方法(否則派生類不能成具體類)
2)(abstract)抽象方法只能在抽象類中聲明,(virtual)虛方法不是。
3)(abstract)抽象方法必須在派生類中重寫而(virtual)虛方法不必。
4)(abstract)抽象方法不能聲明方法實體,虛方法可以。
E. C#如何實現重載和重寫
任何類中的方法都可以重載,重載後的方法實際上是不同的方法,只是他們的名稱相同罷了.
重寫只能是子類override父類中的虛方法,他們是完全相同的方法,重寫之後子類中的方法是新版本,父類中被override的方法是舊版本,默認的都是調用新版本的方法
F. c#如何重寫類
我們首先要寫一個自定義的事件參數,為了簡單起見,我們的自定義按鈕控制項,增加一個TagNumber屬性,它傳遞一個整型數據,當我們處理控制項的Click事件,能夠從事件參數類實例中取得我們在這個屬性中設置的值,因此,我們需要一個MyButtonClickAgre,它從EventArgs類派生。
[csharp]view plainprint?
///<summary>
///自定義事件參數類。
///</summary>
:EventArgs
{
int_value;
publicMyButtonClickAgre(intn)
{
this._value=n;
}
publicintTheNumber
{
get{returnthis._value;}
}
}
現在,從Button類派生一個新類。
[csharp]view plainprint?
publicclassMyButton:Button
{
int_num;
//構造函數
publicMyButton()
:base()
{
this._num=0;
}
///<summary>
///用作參數傳遞的整型數據。
///</summary>
[System.ComponentModel.Browsable(true)]
[System.ComponentModel.Description("獲取或設置一個整數。")]
[System.ComponentModel.Category("數據")]
publicintTagNumber
{
get{returnthis._num;}
set{this._num=value;}
}
}
好,TagNumber屬性定義好了,Browsable特性表示控制項中設計時是否顯示在「屬性」窗口中,Description用一些文本描述屬性有什麼用途這類的信息,Category表示該屬性在「屬性」窗口屬於哪個類別,可能很多人覺得要傳遞一個英文的字元串作為分類名,其實不一定,如果你的VS是中文版的,你完全可以使用中文名字,如上面的「數據」。
在「屬性」窗口中瀏覽該控制項的屬性如下圖所示。
下面,我們還有一件重要的事情要做,那就是重寫基類的Click事件。這里有兩種方法:
1、第一種方法不算得上是重寫事件,應該說是我們經常做的重寫On????方法,如我們下面要通過重寫OnClick方法來達到我們要的效果。
[csharp]view plainprint?
///<summary>
///重寫OnClick方法。
///</summary>
protectedoverridevoidOnClick(EventArgse)
{
base.OnClick(newMyButtonClickAgre(this._num));
}
這樣,我們自定義的事件參數就傳到事件處理程序了。
2、第二種方法才算是重寫事件,通過new關鍵字重新定義一個Click事件。
[csharp]view plainprint?
//新的Click事件。
publicnewEventHandlerClick;
///<summary>
///重寫OnClick方法。
///</summary>
protectedoverridevoidOnClick(EventArgse)
{
if(Click!=null)
{
Click(this,newMyButtonClickAgre(this._num));
}
}
這個時候,我們就不需要基類的OnClick方法了,所以也不用再寫上base.OnClick(e);。
現在,我們重新生成一下項目,切換到WinForm設計器窗口,在工具箱中就能看到我們自定義的控制項了。
好,現在可以測一測這個新控制項了。
[csharp]view plainprint?
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidmyButton1_Click(objectsender,EventArgse)
{
if(eisMyButtonClickAgre)
{
MyButtonClickAgrece=easMyButtonClickAgre;
if(ce!=null)
{
MessageBox.Show(ce.TheNumber.ToString());
}
}
}
}
G. c# 重寫基類方法時,Override 和 New 的區別
override就是子類將父類的方法重新實現了一遍。
new就是說這個方法就是子類自己的,跟父類沒有任何繼承關系關系,僅僅是重名
public class A
{
public virtual string Function()
{
return "1";
}
}
public class B : A
{
public override string Function()
{
return "2";
}
}
public class C : A
{
public new string Function()
{
return "3";
}
}
public class JustForTest
{
public void DoTest()
{
B b = new B();
C c = new C();
Console.WriteLine(b.Function());
Console.WriteLine(c.Function());
Console.WriteLine((b as A).Function());//這兩個就體現出來了,B還是調用自己,返回2
Console.WriteLine((c as A).Function());//C調用的是基類,返回0
}
}
H. C 編程中 子類(派生類)能不能重寫父類(基類)的函數(方法),除了虛函數
override 方法重寫,而能夠方法重寫的方法需要使用virtual 關鍵字修飾,即虛方法,所以理論上除了虛函數,其他方法是不能重寫的,但可以通過new 修飾符隱藏父類方法,達到重寫父類非虛函數的效果。
I. 如何重寫C#控制項基類的事件
使用OnPaint事件可以隨時繪制圖形 調用窗體的OnPaint事件protected override void OnPaint(PaintEventArgs e){ base.OnPaint(e); //繪圖} 但是如何重寫控制項的OnPaint事件呢?比如說繪圖是在PictureBox中繪制的,那麼如何重寫PictureBox的OnPaint事件? 我們無法直接在窗體的代碼中重寫控制項的OnPaint事件,只能重寫窗體的OnPaint事件。 重寫控制項的OnPaint事件,必須創建一個新的控制項。這個控制項繼承Windows的控制項,然後在創建的控制項中重寫控制項的OnPaint事件。 以PictureBox為例: //定義一個新的控制項,繼承PictureBox控制項 public class myPictureBox : PictureBox { //自定義控制項的構造函數 public myPictureBox() { } //重寫控制項的OnPaint屬性 protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //繪圖 } } 使用這種方法,就可以重寫任何一個控制項的OnPaint事件了。
J. C#中沒有找到適合的方法來重寫問題
重寫是指重寫基類的方法,在基類中的方法必須有修飾符virtual,而在子類的方法中必須指明override。
格式:
基類中:
public virtual void myMethod()
{
}
子類中:
public override void myMethod()
{
}
重寫以後,用基類對象和子類對象訪問myMethod()方法,結果都是訪問在子類中重新定義的方法,基類的方法相當於被覆蓋掉了。如下例子:
using System;
class a
{
int x=1;
public virtual void PrintFields()
{
Console.WriteLine("x={0}",x);
}
}
class b:a
{
int y=2;
public override void PrintFields()
{
Console.WriteLine("y={0}",y);
}
}
class c
{
public static void Main()
{
b me=new b();
me.PrintFields();
a y=new b();
y.PrintFields();
}
}
以上代碼運行結果:
y=2
y=2
如果把上面代碼中的override去掉
那麼運行的時候是不會有錯誤,但是會有個警告,因為編譯器不知道你是要重寫該方法,還是隱藏該方法。如果重寫那麼就加override,如果是隱藏那麼就加new,其實不加new也可以運行,但是我們一般還是加上去。
如果是加了new,那麼運行結果是:
y=2
x=1