C#虚方法和抽象方法的区别

一,如下例子

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

namespace DemoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            B a = new B();
        }
    }
    public class A
    {
        public A()
        {
            Say();
        }
        protected virtual void Say() {
            Console.WriteLine("A");
        }
    }

    public class B : A
    {
        protected override void Say()
        {
            Console.Write("B");
        }
    }
}

结果:

输出的则是B

二,通过调试得出结论:

当B继承A时,并重写A中的方法,程序运行的时只会进入到B中重写的方法Say(),而不会进入A中的Say()

三,抽象方法和虚方法的区别

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

namespace abstractOrvirtual
{
    class Program
    {
        static void Main(string[] args)
        {
            AbstractDemo ab = new Test();
            ab.AbstractEvent();
            ab.VirtualEvent();
            ab.VirtualEvent2();
        }
    }
    public abstract class AbstractDemo
    {
        public abstract void AbstractEvent();
        //public abstract void AbstractEvent2()   //无法声明主体,因为它标记为 abstract
        //{
        //    Console.WriteLine("抽象方法");
        //}
        public virtual void VirtualEvent()
        {
            Console.WriteLine("虚方法");
        }
        public virtual void VirtualEvent2()
        {
            Console.WriteLine("虚方法");
        }
        // public virtual void VirtualEvent2();必须声明主体,因为它未标记为 abstract、extern 或 partial

    }
    public class Test : AbstractDemo
    {
        public override void AbstractEvent()  //抽象方法可以被重写
        {
            Console.WriteLine("抽象方法");
        }
        public virtual void VirtualEvent2()//虚方法可以被重写
        {
            Console.WriteLine("虚方法2");
        }
    }
}
原文地址:https://www.cnblogs.com/May-day/p/6724021.html