虽然不宜在构造函数中调用虚函数(动态绑定的函数),但如果调用了会发生什么呢?这是用Java和C++分别写的两个功能类似的小程序,结果却是不太一样,说明不同语言其实对多态的解释是不一样的。
C++版及运行结果
/* Base() Base.f() Sub() Sub.f() */
#include <iostream> using namespace std; class Base{ public: Base(){ cout << "Base()"<<endl; this->f(); } virtual ~Base(){ } virtual void f(){ cout << "Base.f()" <<endl; } }; class Sub:public Base{ public: Sub(){ cout << "Sub()"<<endl; } ~Sub(){ } void f(){ cout << "Sub.f()" <<endl; } }; int main(int argc,char * argv[]){ Sub s; Base & b = s; b.f(); return 0; }
Java版及运行结果
/* 运行结果 Base() Sub().f() Sub() Sub().f() */
package cn.edu.fjnu;
public class Base { public Base(){ System.out.println("Base()"); this.f(); } public void f(){ System.out.println("Base().f()"); } }
class Sub extends Base{ public Sub(){ System.out.println("Sub()"); } public void f(){ System.out.println("Sub().f()"); } } class Test{ public static void main(String [] args){ Base b = new Sub(); b.f(); } }