什么是实现C++ instanceof的等价于java的首选方法?

推荐答案

try 使用:

if(NewType* v = dynamic_cast<NewType*>(old)) {
   // old was safely casted to NewType
   v->doSomething();
}

这要求编译器启用rtti支持.

编辑:

每次你需要使用动态投射(或instanceof)时,你最好问问自己这是否是必要的.这通常是设计拙劣的标志.

典型的解决方法是将要判断的类的特殊行为放入基类上的一个虚拟函数中,或者可能引入类似于visitor的东西,在其中可以在不更改接口的情况下为子类引入特定行为(当然,除了添加访问者接受接口).

正如前面所指出的,dynamic_cast并不是免费提供的.处理大多数(但不是所有)情况的一个简单且持续执行的hack基本上是添加一个枚举,表示类可以拥有的所有可能类型,并判断您是否得到了正确的类型.

if(old->getType() == BOX) {
   Box* box = static_cast<Box*>(old);
   // Do something box specific
}

这不是一个好的oo设计,但它可以是一个变通方法,其成本或多或少只是一个虚拟函数调用.无论RTTI是否启用,它都可以工作.

请注意,这种方法不支持多级继承,因此如果不小心,可能会以如下代码结尾:

// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
   Box* box = static_cast<Box*>(old);
   // Do something box specific
}

Java相关问答推荐

如何使用反射在Java中获取注释的属性?

RandomGenerator (L32X64MixRandom) 的默认算法每次生成相同的数字

为什么最近调用 onAdDismissedFullScreenContent ?

如何将二维数组收集到 Map> 中?

如何计算字符矩阵中单词的所有出现次数?

是否可以将字符串“1L”转换为相应的 Long 值?

设计查询 - 使用 Java 泛型进行代码复制

如何在Java中合并包含相同值的多个数组

春天卡夫卡 |如何使 DeserializationException 可重试?

使用 JUnit 和 Mockito 编写单元测试

用于双向 Hibernate 关联的 MapStruct 自定义列表映射

关闭应用程序时单击通知按钮打开活动

Spring OAuth 2.0 with jersey request:输入正确凭据后响应 401 Unauthorized

如何用填充零计算整数

如何在 Spring-Data-JDBC 中设置 fetch-size

Java中的重复输出

如何使用 Math.random() 在 Java 中模拟 60% 的概率

聊天应用 - 更新令牌聊天片段 - 新版本

Android - 中止崩溃

org.apache.kafka.common.errors.SerializationException:未知的魔术字节