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