virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。

它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。

但是它们的区别很大。(virtual是“虚拟的”,abstract是“抽象的").

(1)virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。如对于virtual修饰的方法如果没有实现:

  public class Test1
{
public virtual void fun1();
}

错误    2    “Test1.fun1()”必须声明主体,因为它未标记为 abstract、extern 或 partial

对于abstract修饰的方法如果有实现:

        public abstract class Test2
{
public abstract void fun2() { }
}

错误    1    “Test2.fun2()”无法声明主体,因为它标记为 abstract

(2)virtual可以被子类重写,而abstract必须被子类重写,

class BaseTest1
{
public virtual void fun() { }//必须有实现
}
class DeriveTest1:BaseTest1
{
//public override void fun() { }
}

编译不会出现错误,如果重写了virtual修饰的方法,前面必须添加override(这样就告诉了编译器你要重写虚拟方法),而且必须有实现,否则编译出错

    abstract class BaseTest2
{
public abstract void fun();
}
class DeriveTest2 : BaseTest2
{
//public override void fun();错误1:没有实现
//public void fun() { } 错误2:重写时没有添加override
//override void fun() { }错误3:虚拟成员或者抽象成员不能是私有的(只要在父类中声明了虚拟成员或抽象成员,即便是继承的也要加上这个限制)
public override void fun() { }//如果重写方法; 错误:“A.DeriveTest2”不实现继承的抽象成员“A.BaseTest2.fun()” }

  

(3)如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

(4)无法创建abstract类的实例,只能被继承无法实例化,比如:     BaseTest2 base2 = new BaseTest2();将出现编译错误:抽象类或接口不能创建实例。
(5)C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。

(6)abstract方法必须重写,virtual方法必须有实现(即便它是在abstract类中定义的方法).

abstract public class Test
{
//public virtual void Prinf();错误:virtual方法必须有实现
public virtual void Prinf() //abstract类的virtual方法可以不重写;abstract方法必须重写。
{
Console.WriteLine("Abstract Printf...");
} }
public class Class1 : Test
{
/*
public override void Prinf() //派生类中不重写abstract类的virtual方法照样可以运行,不过调用派生类对象的Printf方法时,调用的是父类的。
{ Console.WriteLine("Class One Override Printf...");
}
*/
}

  

C# virtual abstract的更多相关文章

  1. virtual abstract override new 几点学习

    1.Vitual方法和普通方法区别为:继承其的子类可以用override/new在重载此方法,也可以不重载其方法,有方法体(可以写语句),override修饰则调用子类方法2.abstract类中抽象 ...

  2. c#中virtual, abstract和override的区别和用法

    virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...

  3. C#--virtual,abstract,override,new,sealed

    virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚 ...

  4. C# selecd,new,virtual,abstract与override

    本文大部分内容摘自  <.NET开发专家·亮剑.NET : .NET深入体验与实战精要> 博主只是搬运工,不喜勿喷. 关于虚方法,抽象类这一部分一直不是太清楚,目前的工作中也接触不到这些. ...

  5. C#--virtual,abstract,override,new,sealed修饰符学习

    1.参考博客  http://www.cnblogs.com/oneword/archive/2009/07/02/1515279.html http://www.cnblogs.com/mygood ...

  6. sealed,new,virtual,abstract与override关键字的区别?

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...

  7. virtual abstract override

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  8. Java/C++之 public、protected、private ; virtual & abstract

    一.绪 Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆.本文总结了一些这两门语言的差异之处,仅供参考. 二.C++ 对于C++这门语言,就其类 ...

  9. Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息

    Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...

随机推荐

  1. Oracle EBS View 视图查看没有数据

    --关于看视图查看没有数据的问题 --原因OU过滤关系 --Oracle SQL*Plus --toad EXECUTE  fnd_client_info.set_org_context(:ou_id ...

  2. Android-Sqlite3的使用

    Sqlite3的使用: adb remount --> 挂载上 adb devices -->查看设备 adb shell -->进入Android文件系统 cd /data/dat ...

  3. 自我介绍及注册github和上传文件

    自我介绍: 周侃 年龄20 喜好:玩游戏,赚钱,交际 理想:想要改变中国手游界颓靡的时代,让它进入新次元. 注册github,以及上传文件: 今天给大家来讲解下如何注册githup 当我们打开gith ...

  4. C#基础笔记(第十八天)

    1.HTMLHyper Text Markup Language 超文本标记语言在HTML当中存在着大量的标签,我们用HTML提供的标签,将要显示在网页中的内容包含起来.就构成了我们的网页. CSS: ...

  5. js日期转换工具

    var dq = new Date();//定义当前时间var sDueDate = formatDate(dq);/调用日期转换方法 传入当前时间 //进行日期转换 function formatD ...

  6. 【QT】二进制读取图像文件并显示

    打开对话框选择文件 二进制方式读取文件 转换成图像显示 void MainWindow::showImage() { //打开文件对话框 QString lastPath="D:/Engli ...

  7. FusionCharts的使用方法 - 公司所用的flash式的图像统计工具

    我们公司一直用这个图表统计, 最近整理了一下相关文档,提供大家学习. 首先可以看看 http://www.cnblogs.com/xuhongfei/archive/2013/04/12/301688 ...

  8. linux进程管理(二)

    接上[linux进程管理(一)] 终止进程的工具 kill .killall.pkill 终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ...

  9. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...

  10. 使用Fiddler代理调试本地手机页面

    从事前端开发的同学一定对 Fiddler 不陌生,它是一个非常强大的http(s)协议分析工具.我们知道如何在电脑上调试页面请求,但在手机端你没有这么多强大好用的调试工具来调试你的webapp,如果你 ...