08月27, 2007

C++、Java类方法绑定方式对比

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 关键词以支持动态绑定

本文链接:http://aztack.wang/post/cmp-method-binding-in-java-and-cpp.html

-- EOF--

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。