C#中虚方法重载

在C#中,进行虚方法的重载有些体会,现与大家分享。
首先请大家看看下面的例子,
using System;

abstract public class contact
{
public virtual string prinf()
{
return ("这是虚方法");
}
}

public class class1:contact
{
public string prinf()
{
return ("这是新的方法");//但这会出现编译警告,因为已经从contact那继承了一个同名方法
}
}
想要通过编译,只需将prinf的声明改为
public override string prinf()

public new string prinf()
但是这两种声明方式是有区别的,
请看下面的例子:
using System;

abstract public class contact
{
public virtual string prinf()
{
return ("这是虚方法");
}
}

public class class1:contact
{
public override string prinf()
{
return ("这是新的方法");
}
}
public class class2:contact
{
public new string prinf()
{
return ("这是另一个新的方法");
}
}
public class text
{
public static void Main()
{
contact [] contacts=new contact [2];
contacts[0]=new class1;
contacts[1]=new class2;
foreach(contact ct in contacts)
{
Console.WriteLine(ct.printf);
}
}
}

最后我们看到的结果是

这是新的方法
这是虚方法

而没有看见“这是另一个新的方法”,这是因为class2没有重载虚方法,而是重新定义了一个方法!
这就是两者的区别!!!  

时间: 2024-12-23 05:19:32

C#中虚方法重载的相关文章

关于C#中虚方法重载的说明

在C#中,进行虚方法的重载有些体会,现与大家分享.首先请大家看看下面的例子,using System; abstract public class contact{ public virtual string prinf() { return ("这是虚方法"); }} public class class1:contact{ public string prinf() { return ("这是新的方法");//但这会出现编译警告,因为已经从contact那继承了

C#类中虚方法相互调用的潜在重载错误

错误    当我们编写基类虚方法时,需要注意一个问题,就是基类中虚方法的相互调用,有可能引起派生类重载时的潜在错误隐患.当然这个错误并不是C#语言设计的缺陷,而是一个不可避免的实现而已.当然如果我们是要编写通用的组建基类,就需要注意一下了.     或许我们刚开始做OOP的时候,对于有没有方法有没有virtual根本不在乎,很多是时候我们都重写了(rewrite)了基类方法.当然在需要确定重载(override)的时候,virtual关键字限定基类方法是不可少的.那么是不时我们就可以把基类的方法

JavaScript中的方法重载实例

 这篇文章主要介绍了JavaScript中的方法重载实例,本文直接给出重载实例,需要的朋友可以参考下     .NET里面的方法重载用着的确很方便,哪Javascript里面能不能也哪样做呢? Javasciprt里面本生是没有方法重载的功能,以前很多人的做法可能是直接少传参数过去,然后在根据参数是否为 "undefined" 未定义来决定怎么处理,从而实现类似方法重载的功能. 例如:   代码如下: var showMessage = function(name,value,id){

JavaScript中的方法重载实例_javascript技巧

.NET里面的方法重载用着的确很方便,哪Javascript里面能不能也哪样做呢? Javasciprt里面本生是没有方法重载的功能,以前很多人的做法可能是直接少传参数过去,然后在根据参数是否为 "undefined" 未定义来决定怎么处理,从而实现类似方法重载的功能. 例如: 复制代码 代码如下: var showMessage = function(name,value,id){     if(id != "undefined"){         alert(

[c#]Webservice中如何实现方法重载(overload)以及如何传送不能序列化的对象作参数

1.Webservice中的方法重载问题 (1)在要重载的WebMethod上打个MessageName标签 比如:[WebMethod(MessageName = "HelloWorld1")]public string HelloWorld(){     return "HelloWorld"; } [WebMethod(MessageName = "HelloWorld2")]public string HelloWorld(string

Javascript中的方法和匿名方法实例详解_javascript技巧

本文实例讲述了Javascript中的方法和匿名方法.分享给大家供大家参考.具体分析如下: Javascript方法(函数) 声明函数 以function开头,后跟函数名,与C#.java不同,Javascript不需要声明返回值类型.参数类型.没有返回值就是undefined. 举个例子更清楚:  无参数无返回值的方法: function f1(){ alert('这是一个方法'); } f1();//调用方法 无参数有返回值的方法: function f2(){ return 100; }

在派生类中对虚方法进行重载

先让我们回顾一下普通的方法重载.普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法. 而对基类虚方法的重载是函数重载的另一种特殊形式.在派生类中重新定义此虚函数时,要求的是方法名称.返回值类型.参数表中的参数个数.类型.顺序都必须与基类中的虚函数完全一致.在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符. 还是让我

c#中虚函数的相关使用方法_C#教程

若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法. 虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允许有static,abstract,或override修饰符虚方法不能是私有的,因此不能使用private修饰符虚方法的执行:我们知道一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象

C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好?

问题描述 C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好? //brass.h -- bank account classes#ifndef BRASS_H_#define BRASS_H_#include //brass account classclass Brass{private: std::string fullName; //x姓名 long acctNum; //账号 double balance; //当前结余public: Brass(const std::strin