什么是C++ 11相当于Java的实例

pez*_*pez 8 c++ java instanceof multiple-languages c++11

我想知道现代C++ 11相当于Java的实例.我已经看过这个SO帖子,但它已经很老了,并且想知道在C++ 11中是否有更现代,更好的解决方案?

我希望有可能使用switch结构而不必使用手动枚举类.

class A {

};

class B : public A {

}

class C : public A {

}

on_event(A& obj)
{
    switch (obj) {
       case A:
       case B:
       case C:
    }
}
Run Code Online (Sandbox Code Playgroud)

我的基类没有任何虚拟方法或函数.我代表解析器的表达式树,基类只是一个多态持有者 - 就像Haskell/OCaml中的ADT一样.

Ker*_* SB 12

同样的答案仍然适用,并且在C++中一直是这样的:

if (C * p = dynamic_cast<C *>(&obj))
{
    // The type of obj is or is derived from C
}
else
{
    // obj is not a C
}
Run Code Online (Sandbox Code Playgroud)

这种结构需要A是多态的,即具有虚拟成员函数.

另请注意,此行为与比较不同typeid(obj) == typeid(C),因为后者测试精确类型标识,而动态转换以及Java instanceof仅测试目标类型是最派生对象类型的基类.

  • @ user2485710:在C++中没有这样的东西.你不能"没有RTTI"并且仍然拥有C++. (4认同)
  • @ user8090:不要这样做.这会让这个问题变得荒谬.你要求Java等价,但*Java中的所有*都是多态的.如果您需要解决C++特定的问题,请提出一个新问题. (4认同)
  • 由于这个问题被标记为C++ 11,你可以将`C*`替换为`auto`;) (2认同)