C++中,如果父类中的函数前边标有virtual,才显现出多态。
如果父类func是virtual的,则
Super *p =new Sub();
p-func(); // 调用子类的func
如果不是virtual的,p-func将调用父类原来的函数。
Java中,不论写不写virtual都是多态的,子类的同名函数会override父类的。与C++很不同的是,初始化的过程也不相反。在还未初始化子类的时分,子类的同名函数就已经覆盖了父类的了。例如:
public class Super { public Super() { System.out.println("super constructor..."); m(); }
protected void m() {
System.out.println("test"); } }
public class Sub extends Super{ private final Date date; public Sub(){ System.out.println("sub constructor..."); date=new Date();} public void m() { System.out.println(date); }
public static void main(String[] args) { Super test1=new Sub();
test1.m(); //执行的子类的m } }
new Sub的时分首先调用Super,Super构造函数调用的m就已经是被Sub覆盖的m,所以会print出null(因为日期没有初始化)。所以在java中,不要在父类构造函数中调用外部可改变的方法,有能够会输入可改变方法中还没初始化的东西。
但是,异样的初始化在C++中,初始化一个子类的时分,父类调用的m,是父类自己的m,不会调用子类的。
——————
另外一个参考也很有用:7880/info/Article-51701560.html,如下:
C++和java中多态机制的异同