众所周知,早期绑定是声明特定数据类型对象的概念,并且它不能容纳任何其他类型的对象.虽然后期绑定是声明泛型类型的对象的概念,并且可以保存任何其他类型的实例.考虑这个例子:
public abstract class Animal
{
public virtual string Name { get { return "Animal"; } }
}
public class Dog : Animal
{
public override string Name { get { return "Dog"; } }
}
public class Cat : Animal
{
public override string Name { get { return "Cat"; } }
}
public class Test
{
static void Main()
{
Animal animal = new Dog();
Animal animalTwo = new Cat();
Console.WriteLine(animal.Name);
Console.WriteLine(animalTwo.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是编译器什么时候会识别对象的函数调用,要么是在编译时还是在运行时?如果我不清楚,我很抱歉.但我的意思是问虚拟骑乘和虚拟方法的概念是否涉及后期绑定?..如果没有那么这怎么可能.
运行.
虚函数意味着调度在运行时路由到活动对象引用上的函数.在C++中,这是通过一个名为vtable的指针表来完成的.我不确定C#是如何做到的,我认为它是依赖于实现的,但结果是一样的.
在编译时,编译器将函数调用绑定到基类上的函数.该基类函数是虚函数,因此在运行时.Net将查看实际的对象类型并查看它是否覆盖该函数.如果是,那将调用派生类型.