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