实现C++等价的首选方法是instanceof
什么?
尝试使用:
if(NewType* v = dynamic_cast(old)) { // old was safely casted to NewType v->doSomething(); }
这要求您的编译器启用rtti支持.
编辑:我对这个答案有一些好评!
每次你需要使用dynamic_cast(或instanceof)时,你最好问问自己这是否是必要的.这通常是设计不佳的标志.
典型的解决方法是将要检查的类的特殊行为放入基类的虚函数中,或者引入类似访问者的内容,您可以在不改变界面的情况下为子类引入特定行为(除了添加访问者接受接口)课程).
正如所指出的,dynamic_cast不是免费的.处理大多数(但不是所有情况)的简单且始终如一的执行hack基本上是添加一个枚举,表示您的类可以拥有的所有可能类型,并检查您是否拥有正确的类型.
if(old->getType() == BOX) { Box* box = static_cast(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(old); // Do something box specific }
根据您的要求,您可以执行以下操作:
templateinline bool instanceof(const T*) { return std::is_base_of ::value; }
使用:
if (instanceof(ptr)) { ... }
但是,这纯粹依赖于编译器已知的类型.
编辑:
此代码应适用于多态指针:
templateinline bool instanceof(const T *ptr) { return dynamic_cast (ptr) != nullptr; }
示例:http://cpp.sh/6qir