C#
C#中实现多态有三种方式:抽象类,虚方法,接口
其中虚方法的概念,用virtual 关键字来表示,每个类都会有一个虚函数表。
该虚函数表首先会从父类中继承得到父类的虚函数表,如果子类中重写了父类的虚函数(不管重写后的函数是否为虚函数),要调用哪个虚函数,是根据当前实际的对象来判断的(不管指针所属类型是否为当前类,有可能是父类型),指针当前指向的是哪种类型的对象,就调用哪个类型中类定义的虚函数。每个类只有一张虚拟函数表,所有的对象共用这张表。
C#的函数多态就是通过虚函数来实现的
C#中,如果函数不是虚函数,则调用某个函数,是根据当前指针类型来判断的,并不是根据指针所指向对象的类型。
Java
Java中没有Virtual关键字,没有虚方法的概念。
在Java中,如果函数不是抽象函数,而是一个普通函数,它是默认实现类似C#中虚函数功能的。
也就是说,调用某个函数,是根据当前指针所指向对象的类型来判断的,而不是根据指针类型判断。正好与C#中的普通函数相反。即:JAVA里自动实现了虚函数