虚方法(virtual)和抽象方法(abstract)的区别

一,直接上代码,后总结:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Testvirtual Tv = new Testvirtual();
            Tv.Say();
            Tv.CommonMethod();
            Instanvirtual Iv = new Instanvirtual();
            Iv.Say();

            //Testabstract Ta = new Testabstract();  //提示错误:无法创建抽象类或接口的实例
            Testabstract Ta = new Instanabstract();
            Ta.Say();
            Ta.SayVir();  //而抽象类中存在虚方法则不必需在派生类(子类)中重写,因为虚方法本身有声明主体,所以一样可以输出
            Console.ReadKey();

        }
    }
    public class Testvirtual
    {
        public virtual void Say()
        {
            Console.WriteLine("虚方法");
        }

        public void CommonMethod()
        {
            Console.WriteLine("一般方法");
        }
    }
    public class Instanvirtual : Testvirtual
    {
        public override void Say()
        {
            Console.WriteLine("重写虚方法");
        }

        //这个如果父类一般方法没有使用virtual,abstract关键字,则会提示没有找到适合的方法来重写
        //public override void CommonMethod()
        //{
        // Console.WriteLine("重写一般方法");
        //}
    }
    public abstract class Testabstract  //定义抽象方法,必须在抽象类中
    {
       // public abstract void Test() {     //如果这样会会提示:无法声明主体,因为它标记为abstract,并且提示不实现继承的抽象成员
         //   Console.WriteLine("抽象方法");
        //}

        public virtual void SayVir() {
            Console.WriteLine("抽象类的虚方法");
        }

        public abstract void Say();

        public void CommonMethod() { }
    }

    public class Instanabstract : Testabstract
    {
        public override void Say()
        {
            Console.WriteLine("重写抽象方法");
        }

        //这个如果父类一般方法没有使用virtual,abstract关键字,则会提示没有找到适合的方法来重写
        //public override void CommonMethod() {
        //Console.WriteLine("重写一般方法");
        //}
    }
}

综上总结出:如果一般方法没有使用virtual,abstract关键字,则会提示没有找到适合的方法来重写,

一,抽象方法:

1,抽象方法必须在抽象类中定义

2,抽象方法必须在派生类(子类)中实现

3,抽象类中的抽象方法无法声明主体,因为它标记为abstract

4,无法创建抽象类或接口的实例

二,虚方法

1,虚方法不必须在派生类(子类)中重写实现

2,虚方法声明方法实体

3,可以创建虚方法类的实例

 4,如果抽象类中有虚方法,不必须在派生类(子类)中重写,如上代码调用实现

原文地址:https://www.cnblogs.com/May-day/p/6489523.html