在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++逻辑