📜  C++ 中的 RTTI(运行时类型信息)(1)

📅  最后修改于: 2023-12-03 15:13:58.526000             🧑  作者: Mango

C++中的RTTI(运行时类型信息)

C++中的RTTI (Run-Time Type Information) 是一种语言特性,提供了在程序运行时获得对象类型信息的能力。RTTI允许程序员在运行时获取关于类的类型信息,包括类的名称、是否能够进行类型转换以及如何进行类型转换等。

RTTI的使用

在C++中,RTTI主要通过两个运算符来实现:dynamic_casttypeid。这两个运算符可以用于动态类型识别和类型转换。

dynamic_cast运算符

dynamic_cast运算符用于在继承关系的类层次结构中执行安全的向下转型(downcast)。它可以将指向基类的指针或引用转换为指向派生类的指针或引用。

class Base {
public:
   virtual void print() {
       cout << "This is a Base class." << endl;
   }
};

class Derived : public Base {
public:
   void print() override {
       cout << "This is a Derived class." << endl;
   }
};

int main() {
   Base* basePtr = new Derived;
   Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
   // 使用derivedPtr进行Derived类的操作
   delete basePtr;
   return 0;
}

dynamic_cast将基类指针basePtr转换为派生类指针derivedPtr,保证了类型转换的安全性。如果转换失败,dynamic_cast将返回nullptr

typeid运算符

typeid运算符用于获取表达式的实际类型信息。它可以用于获取对象的类型ID、判断两个类型是否相同以及在程序中进行类型判断。

class Base {
public:
   virtual void print() {
       cout << "This is a Base class." << endl;
   }
};

class Derived : public Base {
public:
   void print() override {
       cout << "This is a Derived class." << endl;
   }
};

int main() {
   Base* basePtr = new Derived;
   if (typeid(*basePtr) == typeid(Derived)) {
       cout << "basePtr指向的对象是Derived类的实例。" << endl;
   }
   delete basePtr;
   return 0;
}

typeid(*basePtr)返回的是Derived类的类型信息,通过判断该类型信息和Derived类的类型信息是否相同,可以进行类型的判断。

RTTI的限制

C++中的RTTI虽然提供了在运行时获取类型信息的便利,但也有一些限制和注意事项:

  • RTTI只对具有虚函数的类有效。如果类没有任何虚函数,使用RTTI的操作将无法进行。
  • dynamic_cast只能用于多态类型(即具有虚函数的类)。
  • 使用RTTI会引入一些运行时开销,尤其是在多层次的继承结构中。
  • RTTI不能用于原始类型、非多态类、静态类型等。
总结

RTTI(运行时类型信息)是C++中的一个强大特性,允许程序员在运行时获取对象的类型信息并进行类型转换。通过dynamic_casttypeid运算符,我们可以实现安全的向下转型和类型判断。但需要注意的是,RTTI只适用于多态类型,并且可能会引入一些运行时开销。