C++ 中 instanceof 的等效物


C++ 没有直接的方法来检查某个对象是否是某个类的某个实例。在 Java 中,我们可以获得这种便利。

在 C++11 中,我们可以找到一个名为 is_base_of<Base, T> 的项。这将检查给定的类是否是给定对象的基类。但是,这不会验证给定的类实例是否使用该函数。

最接近于“instanceof”功能的可能性是使用 dynamic_cast <new-type>(表达式)。这会尝试将给定的值转换为指定类型并返回结果。如果强制转换失败,则返回一个 null 指针。这只适用于多态指针并且在编译器 RTTI 启用时。

示例代码

#include <iostream>
using namespace std;

template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
   return dynamic_cast<const Base*>(ptr) != nullptr;
}

class Parent {
   public:
   virtual ~Parent() {}
   virtual void foo () { std::cout << "Parent\n"; }
};

class Child : public Parent {
   public:
   virtual void foo() { std::cout << "Child\n"; }
};

class AnotherClass{};
   int main() {

   Parent p;
   Child c;
   AnotherClass a;

   Parent *ptr1 = &p;
   Child *ptr2 = &c;
   AnotherClass *ptr3 = &a;

   if(instanceof<Parent>(ptr1)) {
      cout << "p is an instance of the class Parent" << endl;
   } else {
      cout << "p is not an instance of the class Parent" << endl;
   }

   if(instanceof<Parent>(ptr2)) {
      cout << "c is an instance of the class Parent" << endl;
   } else {
      cout << "c is not an instance of the class Parent" << endl;
   }

   if(instanceof<Child>(ptr2)) {
      cout << "c is an instance of the class Child" << endl;
   } else {
      cout << "c is not an instance of the class Child" << endl;
   }

   if(instanceof<Child>(ptr1)) {
      cout << "p is an instance of the class Child" << endl;
   } else {
      cout << "p is not an instance of the class Child" << endl;
   }

   if(instanceof<AnotherClass>(ptr2)) {
      cout << "c is an instance of AnotherClass class" << endl;
   } else {
      cout << "c is not an instance of AnotherClass class" << endl;
   }
}

输出

p is an instance of the class Parent
c is an instance of the class Parent
c is an instance of the class Child
p is not an instance of the class Child
c is not an instance of AnotherClass class

更新于: 2022-02-16

1.5 万+ 浏览

启动你的 职业生涯

完成该课程以获得认证

入门
广告