c++动态绑定、静态绑定与java中动态绑定与静态绑定的比较

废话不说直接上代码

一、c++中示例

Persion类

#include
using namespace std;
class Persion{
public:
	void display(){
		cout<<"This is Persion"<

Student类

#include
#include"Persion.cpp"
using namespace std;
class Stduent:public Persion{
public:
	void display(){
		cout<<"This is Student"<

测试一:

void test1(){
	Persion *p = new Stduent();
	p->display();
	p = new Persion();
	p->display();
}

结果:

This is Persion
This is Persion

结果分析:由于父类Persion和子类Student中的display()函数都不是虚函数,那么c++中采取的静态绑定的方法,就是定义的对象是什么类型的就调用对应对象中方法;

本例中:Persion *p = new Stduent();p = new Persion();显然指向的对象不一样但都是Persion类型的,所以都是调用的Persion中的display()方法

测试二:

void test2(){
	Persion *p = new Stduent();
	p->show();
	p = new Persion();
	p->show();
}

结果:

This is Student

This is Persion

结果分析:由于父类Persion和子类Student中的show()函数都是虚函数,那么c++中采取的动态绑定的方法,就是谁绑定上来调用谁的;

Persion *p = new Stduent();这个是Student绑定上来的那么就调用Student中的show()方法;p = new Persion();这个是Persion绑定上来的就调用Persion中方法;

总结:如果要想通过父类调用子类中的方法,那么一定要将父类中同名方法声明为虚函数,换句话说,C++中多态是由虚函数来实现的

下面我们来看一下java中的示例:

Persion类:

public class Persion {
	void display(){
		System.out.println("This is Persion");
	}

}

Student类:

public class Student extends Persion {
	void display(){
		System.out.println("This is Student");
	}
}


测试:

public class Demo501 {
public static void main(String[] args) {
	Persion p = new Student();
	p.display();
	p = new Persion();
	p.display();
}
}

结果如下:

This is Student
This is Persion

结果分析:以上java的例子与我们在c++中的第一个例子完全一样,但由于java和c++中动态绑定实现的机制不一样,所以结果不一样,c++的多态是一定要有虚函数来实现的,但是在java中明显就简单的多,就一句话来总结,谁绑定上就调用谁的,Persion p = new Student();看Student绑定上来的就调用Student中的,p = new Persion();Persion绑定上来就调用Persion的


希望这个简单的例子对大家理解C++和Java中的动态绑定和静态绑定带来帮助








你可能感兴趣的:(java,C++,多态,java,c++,动态绑定,静态绑定)