一般情况下,C#中的每个抽象函数都是虚拟的吗?

我在看堆栈溢出问题抽象函数和虚函数有什么区别?我想知道每个抽象函数是否应该被认为是C#中的虚函数还是一般?

我对“你必须忽略/你可能会忽略”对这个问题的回应有些困惑。 不是C#程序员,我倾向于认为抽象函数只是一个编译时概念,而抽象函数是定义的虚函数,因为您必须至少提供一个,但可以在层次结构的更下方提供多个实现。

虚拟函数也有一个编译时间维度,因为你不能覆盖非虚函数,但它们大多是一个运行时概念,因为它只是基于实际的接收器选择了正确的方法实现。


是。 来自C#3.0规范的第10.6.6节:

当实例方法声明包含抽象修饰符时,该方法被称为抽象方法。 虽然抽象方法也隐含地也是虚拟方法,但它不能使修饰符为虚拟。


必须是虚拟的(并且Jon Skeet已经提出了证明它的规范),因为给定对抽象基类的引用,必须调用具体派生类的实现。 例如,给定经典动物层次结构:

abstract class Animal{
    public abstract void Speak();
}

class Cat : Animal{
    public override void Speak(){Console.WriteLine("meow");}
}

class Dog : Animal{
    public override void Speak(){Console.WriteLine("bark");}
}

如果函数不是虚拟的,那么接受Animal对象并调用Speak方法的函数将不知道要调用哪个实现。

static void TalkToAnimal(Animal a){
    Console.WriteLine("Hello, animal.");
    a.Speak();
}

但请注意,接口实现默认情况下不是虚拟的。 由于接口与类的工作方式不同,真正的多态性对于查找接口方法的实现没有必要。


是的。 为了证明:

abstract class A {
    public abstract void Foo();
}
class B : A {
    public override void Foo()
    { /* must do */ }
}
class C : B {
    public override void Foo()
    { /* can do */ }
}
链接地址: http://www.djcxy.com/p/38119.html

上一篇: Is every abstract function virtual in C#, in general?

下一篇: Practical usage of virtual functions in c#