1#include <stdio.h> 2 3#include <string> 4#include <typeinfo> 5 6#include <Directory.h> 7#include <File.h> 8 9using std::string; 10 11struct A { 12 A() {} 13 virtual ~A() {} 14 15 int a; 16}; 17 18struct B : A { 19 B() {} 20 virtual ~B() {} 21 22 int b; 23}; 24 25struct C : A { 26 C() {} 27 virtual ~C() {} 28 29 int c; 30}; 31 32template<typename A, typename B, typename C> 33static void 34rtti_test(A *a, const char *inputClass, const char *classNameA, 35 const char *classNameB, const char *classNameC) 36{ 37 printf("class %s\n", inputClass); 38 printf(" dynamic_cast<%s*>(a): %p\n", classNameA, dynamic_cast<A*>(a)); 39 printf(" dynamic_cast<%s*>(a): %p\n", classNameB, dynamic_cast<B*>(a)); 40 printf(" dynamic_cast<%s*>(a): %p\n", classNameC, dynamic_cast<C*>(a)); 41 const std::type_info *info = &typeid(*a); 42 printf(" typeinfo: %p, name: %s\n", info, (info ? info->name() : NULL)); 43} 44 45int 46main() 47{ 48 // test with artificial classes defined in this file 49 50 #define RTTI_TEST(obj, className) rtti_test<A, B, C>(obj, className, \ 51 "A", "B", "C") 52 53 A a; 54 B b; 55 C c; 56 57 printf("A: %p (vtable: %p)\n", &a, *(void**)&a); 58 printf("B: %p (vtable: %p)\n", &b, *(void**)&b); 59 printf("C: %p (vtable: %p)\n", &c, *(void**)&c); 60 61 RTTI_TEST(&a, "A"); 62 RTTI_TEST(&b, "B"); 63 RTTI_TEST(&c, "C"); 64 65 66 // test with real classes defined in a library 67 68 #undef RTTI_TEST 69 #define RTTI_TEST(obj, className) rtti_test<BNode, BFile, BDirectory>(obj, \ 70 className, "BNode", "BFile", "BDirectory") 71 72 BNode node; 73 BFile file; 74 BDirectory dir; 75 76 printf("BNode: %p (vtable: %p)\n", &node, *(void**)&node); 77 printf("BFile: %p (vtable: %p)\n", &file, *(void**)&file); 78 printf("BDirectory: %p (vtable: %p)\n", &dir, *(void**)&dir); 79 80 RTTI_TEST(&node, "BNode"); 81 RTTI_TEST(&file, "BFile"); 82 RTTI_TEST(&dir, "BDirectory"); 83 84 return 0; 85} 86