C++指针与Java引用的一处区别

csdn上一篇帖子,有点意思

有这样的关系,Father为基类,Boy继承Father,Girl继承Father,在各自的构造函数里打印自己的类名。

在Java中有这样的代码:

div css xhtml xml Example Source Code Example Source Code [http://www.cnblogs.com/tomsheep/]
Father f = new Father();
Boy b = (Boy)f;
Girl g = (Girl)f;

f.test();
b.test();
g.test();

C++有这样的代码:

div css xhtml xml Example Source Code Example Source Code [http://www.cnblogs.com/tomsheep/]
Father *f = new Father;
Boy *b = (Boy*)f;
Girl *g = (Girl*)f;

f->test();
b->test();
g->test();

会有怎样的行为呢?

 

以下是我的理解:

个人认为这是Java中引用的概念和C++指针概念差别的一处体现
首先,Java里肯定会报ClassCastException,这个行为大家都理解,并且都认同,因为本来嘛,一个父类引用强制转为子类引用,编译器不会complain,但运行时会进行真正的类型转换,将父类转为子类,这当然是扯淡,类型检查时发现不兼容,报错。而C++呢,我个人认为,仅仅个人认为,他未尝不想像Java一样,在这种情况下报一个运行时错误,甚至一个compiler错误来警告这个傻X的程序员,但指针的语义没有允许他这么做,指针说到底是从C继承来的,必须保持和C中指针的语义一致,这个指针被转换为子类,但指向的对象仍然是父类,在这里C++指针和Java引用的区别产生了,C++指针不仅在编译时不会报错,在运行时也不会进行类型转换——个人认为这是C指针的遗产,C是一个weak type的语言,指针强转不会动态检查类型,C++为了包容C,指针在这一点上的行为并没有改变,所以这个父类对象开始进行函数名匹配,找到test,调用,当然,他从根本上就看不到Boy或者Girl的test函数,他只能匹配到自己的。所以,打出
Father
Father
Father
而C++中也有引用,如果把楼主这个例子改成
Father f;
Boy &b=f;
Girl &g=f;
会怎么样呢?编译器压根就不让你过!
由此,我们可以看到,C++中的指针,Java中的引用,C++中的引用虽然彼此都有相似的地方,但还是有很大区别的,就严格性和安全性而言,
C++引用>Java引用>C/C++指针

posted on 2010-04-28 00:45  tomsheep  阅读(1958)  评论(1编辑  收藏  举报

导航