c++,java 动态绑定和静态绑定的对比
/* a.cpp */
#include <iostream>
using namespace std;
class Base
{
public:
virtual void method1(){cout<<"Base Method1"<<endl;};
method2(){cout<<"Base Method2"<<endl;};
};
class Derived:public Base
{
public:
void method1(){cout<<"Derived Method1"<<endl;}
void method2(){cout<<"Derived Method2"<<endl;}
};
int main(int argc,char** argv)
{
Base *b = new Derived();
b->method1();
b->method2();
delete b;
return 0;
}
Output:
Derived Method1
Base Method2
/* A.java */
class A
{
public void method1(){
System.out.println("Base method1");
}
public void method2(){
System.out.println("Base method2");
}
public static void main(String[] args){
A a = new B();
a.method1();
a.method2();
}
};
/* B.java */
class B extends A
{
public void method1(){
System.out.println("Derived method1");
}
public void method2(){
System.out.println("Derived method2");
}
}
Output:
Derived method1
Derived method2
从上面的对比中可以看出
c++中要覆盖父类的方法,必须再父类的被覆盖的方法前加virtual,即将改方法声明为虚函数,这样c++编译器会产生一个虚函数表
java中如果子类中的方法名和参数列表与父类中的相同,则父类的方法自动被覆盖,不需要做而外的声明
java中默认是动态绑定或叫晚绑定,所以java中要引入 final 关键词以禁止默认的动态绑定
c++中默认是静态绑定或叫早绑定,所以c++要引入 virtual 关键词以支持动态绑定