Computer >> Máy Tính >  >> Lập trình >> C ++

C ++ tương đương với instanceof

C ++ không có phương thức trực tiếp để kiểm tra một đối tượng có phải là một thể hiện của một loại lớp nào đó hay không. Trong Java, chúng ta có thể có được loại cơ sở này.

Trong C ++ 11, chúng ta có thể tìm thấy một mục được gọi là is_base_of . Điều này sẽ kiểm tra xem lớp đã cho có phải là cơ sở của đối tượng đã cho hay không. Tuy nhiên, điều này không xác minh liệu cá thể lớp đã cho có sử dụng chức năng đó hay không.

Có thể đạt được chức năng gần nhất có thể có tương tự như "instanceof" bằng cách sử dụng dynamic_cast (expression) . Điều này cố gắng giấu giá trị đã cho vào kiểu được chỉ định và trả về kết quả. nếu quá trình ép kiểu không thành công, nó sẽ trả về một con trỏ null. Điều này chỉ hoạt động đối với con trỏ đa hình và khi trình biên dịch RTTI được bật.

Mã mẫu

#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;
   }
}

Đầu ra

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