您的位置:首页 > 编程语言 > C语言/C++

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

2010-04-28 00:45 225 查看
csdn上一篇帖子,有点意思

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

在Java中有这样的代码:


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++有这样的代码:


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++指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: