virtual/override是一对修饰符,基类中需要使用virtual定义某个函数可以被重载,而在派生类中如果想重载基类的函数,需要使用override明确定义。
而abstract在函数级别上使用的话,就表示此函数在基类中不提供实现的代码,而必须在派生类实现。sealed正好相反,如果在类层次上,你不希望某个函数可以被重载,就应该使用sealed将他“锁”住,不允许派生类重载。
对于你第二个问题,interface中的任何函数都不可以有实现的代码,而abstract类就没有这个限制。另外,使用interface可以实现多重继承的概念,因为C#中规定派生类只能从1个类继承,但是却可以实现多个interface。