首先观察下面两个程序(分别使用vc6.0和myecllipse10测试)
#include <iostream> using namespace std; class A { public: void f() { cout<<"class A "<<endl; } }; class B : public A { public: void f() { cout<<"class B "<<endl; } }; void main() { A* p; p = new A(); p->f();//class A p = new B(); p->f();//class A p = new B(); ((B*)p)->f();//class B B* b; //b = new A();//compile error }
class A{ void f(){ System.out.println("class A"); } } class B extends A{ void f(){ System.out.println("class B"); } } public class Test { public static void main(String[] args) { A p = null; p = new A(); p.f();//class A p = new B(); p.f();//class B //B b = (B) new A(); //Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B } }
以上两个程序都有一个父类A,以及子类B,两个类中都有f()方法。
可以发现在c++中,函数调用是根据函数前面指针的类型决定的(p的类型),
java是根据p所指的对象的类型(p = new ?())来决定的。
以后写c++中,如果父类指针要调用子类方法,切记要进行强制类型转换。
一起学习,一起进步,欢迎访问我的博客:http://blog.csdn.net/wanghao109