在
a question regarding the use of
typeid
是C,我建议它可以用来比较对象中的类型比较.我没有看到它做得很好,但是我有Java的平等.
Looking into Java a bit more,这似乎是这样的:Some say应该比较两个对象的实际类,而some say instanceof是正确的使用工具,可能是双重调度.当然有两种情况之一是最合适的,但至少both options are considered.
在C,OTOH中,我几乎找不到与实际类型进行比较的代码.在大多数情况下,使用双重调度(使用dynamic_cast),我找不到任何人坚持快速类型比较是在等待检查开始时做的正确的事情.
我想知道为什么多态类型比较的问题在Java中有两个可接受的解决方案,而在C中只有一个似乎被认为是最佳实践?是否存在显着的技术差异,或仅仅是不同的方法?
注意:我的说法是基于印象,而不是具体的知识.如果它们错了,Java和C在这方面确实是相似的 – 或者不同于上述以外的原因,这显然是一个可以接受的答案.
解决方法
在Java中,所有类型最终派生自Object和Object
定义了一个虚拟函数Object.equals(Object other),所以你
可以与其他任何东西进行比较,无论是否
这是否有意义.在C,没有一个通用的基地,而且
没有隐含的定义==. ==通常只有
当它有意义时被覆盖,用于比较对象
同样的类型,编译器会抱怨如果你写废话
码.在有继承层次结构的情况下,
当然,由作者决定是否有意义
(我通常没有,但有很多例外),如果
所以对于比较对象而言应该是什么意思
不同种类.在层次结构中,或在它之外:它
在BigInteger和
例如,BigFloat,即使类没有关联
遗产.
定义了一个虚拟函数Object.equals(Object other),所以你
可以与其他任何东西进行比较,无论是否
这是否有意义.在C,没有一个通用的基地,而且
没有隐含的定义==. ==通常只有
当它有意义时被覆盖,用于比较对象
同样的类型,编译器会抱怨如果你写废话
码.在有继承层次结构的情况下,
当然,由作者决定是否有意义
(我通常没有,但有很多例外),如果
所以对于比较对象而言应该是什么意思
不同种类.在层次结构中,或在它之外:它
在BigInteger和
例如,BigFloat,即使类没有关联
遗产.
你没有看到C中讨论的问题的原因是,当然,因为你没有定义==,除非有一些它的逻辑意义,然后你根据它定义它逻辑意义在Java中,通常必须定义equals无论如何,所以你必须“发明”一些意义,你得到讨论发明的意义应该是什么.