当前位置: 首页 > 面试题库 >

C ++等同于Java的instanceof

微生宝
2023-03-14
问题内容

实现与Java等效的C ++的首选方法是instanceof什么?


问题答案:

尝试使用:

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

这要求你的编译器启用rtti支持。

编辑:我对这个答案有很好的评论!

每次需要使用dynamic_cast(或instanceof)时,最好问问自己是否必要。通常,这是不良设计的标志。

典型的解决方法是将要检查的类的特殊行为放入基类的虚函数中,或者引入诸如访问者之类的东西,你可以在不更改接口的情况下为子类引入特定行为(除了添加的访问者接受接口)课程)。

如前所述,dynamic_cast不是免费提供的。一个处理大多数(但不是所有情况)的简单且性能一致的hack基本上是添加一个枚举,表示你的类可以拥有的所有可能的类型,并检查你是否找到了正确的类型。

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

这不是一个好的设计,但它可能是一种解决方法,其成本或多或少只是一个虚拟函数调用。无论是否启用了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
}


 类似资料:
  • 问题内容: 在C ++中,我可以定义一个 访问器 成员函数,该函数返回(或引用)私有数据成员的值,以便调用者无法以任何方式修改该私有数据成员。 有没有办法在Java中做到这一点? 如果是这样,怎么办? 我知道关键字但AFAIK应用于 方法 时: 防止在子类中重写/多态化该方法。 使该方法可内联。 (请参见下面@Joachim Sauer的评论) 但这并不限制该方法返回对数据成员的引用,以使调用者无

  • 问题内容: 这是执行字符串替换的两种方法: 如何使用Java做与第一种方法类似的操作? 问题答案: 或更短:

  • 问题内容: 是否有Java等价于PHP的mysql_real_escape_string()? 这是为了避免在将SQL注入尝试传递给Statement.execute()之前进行尝试。 我知道我可以改用PreparedStatement,但让我们假设这些只是一次声明,所以准备它们会导致性能降低。我已经将代码更改为使用PreparedStatement,但是考虑到现有代码的结构方式,escape()

  • 问题内容: 我正在开发Java程序,我确实需要能够以一定的频率和持续时间播放声音,类似于c#方法System.Beep,我知道如何在C#中使用它,但是我找不到用Java做到这一点的一种方法。是否有等效的方法或另一种方法? 问题答案: 我认为没有办法在便携式2 Java 中用“哔”声播放音乐1。您将需要使用我认为的API …除非找到可以为您简化事情的第三方库。 如果您想走这条路,那么此页面可能会给您

  • 问题内容: 我有以下用Java编写的代码。我需要与此等效的C#。 问题答案: 这里的C#代码等效于Java。

  • 问题内容: 我想将Java中的类转换为C#,大部分更改已经完成,但是我不确定这部分。我想转换以下代码行: 我已经试过了: 但是它不能正常工作,因为GetBytes()期望翻倍。我不确定将其转换为双精度是否可以解决问题,所以我想在这里询问。 问题答案: 根据您的编码,您可以执行以下操作: 有关参考,请参见http://msdn.microsoft.com/zh- cn/library/ds4kkd5