现在的位置: 首页 > 综合 > 正文

C++ 与 Java的成员函数对比

2013年01月04日 ⁄ 综合 ⁄ 共 993字 ⁄ 字号 评论关闭

在C++中的成员函数覆盖:

#include <iostream>
using namespace std;
class A
{
public:
void	test()
	{
		cout<<"I'm A\n ";
	}
	
};
class B:public A
{
void test()
	{
		cout<<"I'm B\n'";
	}

};
int main()
{
	A* p = new B;
	p->test();
	return 0;

测试发现输出的是

I'm A

也就是说如果子类的函数如果覆盖了基类的函数的话,如果实例化一个子类并且赋值给基类指针或者基类引用的话,调用被覆盖的函数其实是调用的是基类的成员函数,

但是在Java中不是这样的,对于Java的成员函数覆盖,结合下面的代码讲解会比较直观:

public class A
{
	public void testFun() {
		System.out.print("I'm A");
	}
}


public class B extends A
{
	public void testFun() {
		System.out.print("I'm B");
	}
}


public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new B();
		a.testFun();
		//System.out.print("test");
	}

}

上例输出的是:

I'm B

可以看到,对于Java来说,调用被覆盖的成员函数是通过基类的变量来调用子类的成员函数,这个和C++是不一样的,

假如Java中有这么一个继承链

C1->C2>C3 ......->Cn

其中C1是C2的子类,C2是C3的子类 ........对于Java的类中默认的基类是Object类,内部实现了toString()函数

如果有这么一个函数

void   Func(Object o)

{

       System.out.print(o.toString());

}

如果将以上C1的实例传给该函数的话,如果C1中实现了toString()函数的话,o.toString()调用的则是C1中的toString(),如果其未

实现则沿着继承链检测C2是否实现了toString()如果没有则继续此过程。

因为开了Java的课,很无奈要学Java,从学编程到现在接触的都是C/C++,学习Java很不爽,感觉它在很多地方违背了C++逻辑

抱歉!评论已关闭.