虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?

1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:

//抽象方法
public abstract class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

//虚方法
public class Animal
{
    public virtual void Sleep(){}
    public virtual void Eat(){}
}

2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:

public class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。如:

public abstract class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}

public class Cat : Animal
{
    public override void Sleep()
    {
        Console.WriteLine( "Cat is sleeping" );
    }
    // we need implement Animal.Eat() here

}

编译器会报错:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()',因为我们没有实现抽象类中所有抽象方法。

虚方法(virtual)和抽象方法(abstract)的区别相关推荐

  1. C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载

    C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载 using System; using System.Collections.Generic; using Sys ...

  2. C#中虚方法(virtual)详解

    前言;在前面的博客重写中提到了虚方法和抽象类,本博文详细介绍下虚方法: 目录: 一.虚方法的定义: 二.虚方法的声明: 三.虚方法的调用: 四.虚方法的规则: 五.虚方法注意事项: 六.虚方法的好处: ...

  3. C#进阶学习--虚方法(virtual)

    一.定义 简单的说,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑. 定义关键字:virtual 重写关键字:overrid ...

  4. 虚方法virtual详解(转载)

    从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的 ...

  5. 抽象方法与虚方法的区别

    一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 总结:(1)抽象方法只能声明在抽象类中,使用关键字abstract (2)抽象类中的抽象方法必须被子类 ...

  6. 虚方法、重写方法和抽象方法[转载]

    若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚方法 (virtual method).若其中没有 virtual 修饰符,则称该方法为非虚方法 (non-virtual metho ...

  7. 重写方法,重载方法,虚方法和抽象方法的使用

    重写方法,重载方法,虚方法和抽象方法. 重写:指子类重新实现父类的某些方法,以实现一些新的功能.重写的关键字是override.并且重写的方法其签名是相同的. 重载:指允许类中具有相同函数名的方法,但 ...

  8. 抽象类,虚方法,接口

    这三样很多人容易混淆,在此总结一下 1. 虚方法 Virtual 基类中定义了虚方法,派生类中可以实现,也可以不实现,因为虚方法是有方法体的,如果要实现,派生类中用override重写该方法. pub ...

  9. java 虚函数_Java的虚方法

    虚方法出现在Java的多态特性中, 父类与子类之间的多态性,对父类的函数进行重新定义.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).在Java中,子类 ...

最新文章

  1. 以太坊 智能合约 简介
  2. movsb和movsw
  3. JAVA 之异常处理与IO流
  4. vmware搭建ubuntu虚拟机(包含安装搜狗输入法和apt,dpkg的使用教程)
  5. 关于实现Runnable接口的类中有公共属性问题
  6. 危机时刻,我们需要多少个“冷锋”?
  7. UI素材干货模板|线框图wireframe线框图iOS设计稿
  8. Python爬虫扩展库BeautifulSoup4用法精要
  9. 图说可视化,报表也能做得如此酷炫!
  10. 跟我一起数据挖掘(23)——C4.5
  11. php判断手机 跳转代码,php判断客户端是手机设备然后跳转到手机站
  12. 2007最新最强杀毒软件破解大全
  13. [CGAL] CGAL的编译与使用
  14. 【拼多多】六一儿童节
  15. MySQL数据库比较工具 - mysqldbcompare
  16. cpu与主板的区别、独立显卡与集成显卡
  17. MFC透明位图显示函数
  18. 盒装Ubuntu着装绝妙,闪亮登场
  19. vasp 模拟退火_VASP 计算问题小结
  20. Android 系统电量统计

热门文章

  1. Oracle数据库命令行下数据的导入导出
  2. 2012-2013年下学期计划
  3. KinectFusion——微软基于KINECT的实时三维重建项目(KINECT)
  4. Google 发布浏览器3D插件 O3D API
  5. 人工智能和机器人将成为数据中心最佳“伴侣”
  6. Nginx配置——防盗链
  7. div居中 边框设置 文字行高设置
  8. Bootstrap系列 -- 34. 按钮下拉菜单
  9. getAttribute与getParameter区别
  10. .NET大型Web站点StackOverflow架构分析