C++ 的 RTTI
1.定义:Run-Time Type Information(运行时类型检测),是指程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
2.C++ RTTI中提供了两种常用的类型:
typeid:返回指针或引用所指对象的实际类型
dynamic_cast: 将基类类型的指针或引用安全地转换为派生类型的指针和引用
3.以上两种类型的使用,必须依赖虚函数表
4.下面通过一个例子说明:
给出基类和派生类:
1 class A 2 { 3 public: 4 int num; 5 static int data; 6 virtual void run() 7 { 8 std::cout << "A run \n"; 9 } 10 }; 11 int A::data = 1; 12 class B :public A 13 { 14 public : 15 int num = 0; 16 static int data; 17 void run() 18 { 19 std::cout << "B run\n"; 20 } 21 void test() 22 { 23 std::cout << num << "\n"; 24 std::cout << "B test\n"; 25 } 26 }; 27 int B::data = 2;
测试一:(typeid)
1 void main() 2 { 3 A a1; 4 B b1; 5 A *p1 = &a1; 6 A *p2 = &b1; 7 //typeid:返回指针或引用所指对象的实际类型 8 std::cout << typeid(p1).name() << " " << typeid(p2).name() << std::endl; 9 std::cout << (typeid(p1) == typeid(p2)) << "\n"; 10 11 std::cout << typeid(*p1).name() << " " << typeid(*p2).name() << std::endl; 12 std::cout << (typeid(*p1) == typeid(*p2)) << "\n";//重载的方式判定类型是否一致 13 std::cin.get(); 14 }
测试二:(dynamic_cast)
1 void main3() 2 { 3 //dynamic_cast : 将基类类型的指针或引用安全地转换为派生类型的指针和引用 4 A a1; 5 B b1; 6 A *p1 = &a1; 7 A *p2 = &b1; 8 B *p3(nullptr); 9 //p3 = dynamic_cast<B*>(p2); 10 //dynamic_cast必须要有虚函数,根据虚函数表转换,不能转换 11 //转换失败为空 类的空指针可以调用不调用数据的函数 12 //转换成功就是地址 13 std::cout << p3 << "\n"; 14 p3->test(); 15 std::cin.get(); 16 }
没什么说的,直接看测试样例!