C# - 为什么虚函数不能覆盖抽象函数?

时间:2017-02-21 14:11:53

标签: c#

请考虑以下代码:

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

namespace TestApp
{
    interface IMammalClass
    {
        string Speak();
    }

    public abstract class absMammalClass : IMammalClass
    {
        public abstract string Speak();
    }

    public class basePetClass : absMammalClass
    {
        public virtual override string Speak()
        {
            return "Make Noise";
        }
    }

    public class DogClass : basePetClass
    {
        public override string Speak()
        {
            return "Bark";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DogClass spot = new DogClass();
            Console.Out.WriteLine(spot.Speak());
        }
    }
}

当我尝试编译代码时,我得到一个"覆盖不能被标记为新的或虚拟的" "公共虚拟覆盖字符串Speak()"方法。我知道有很多方法,但我想知道C#背后的原因是什么,不允许虚拟文件覆盖摘要。

2 个答案:

答案 0 :(得分:8)

覆盖其基本方法的方法是隐式虚拟的(除非使用sealed关键字另有说明),您不需要指定它。

答案 1 :(得分:3)

来自MSDN

  • 抽象方法隐式是虚方法。
  • 抽象方法声明仅允许在抽象类中使用。
  • 实现由最重要的方法提供。
  • 抽象方法也可以在抽象类中重写。