1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
| typedef void(*Fun)(void);
class Tmp { public: short a; int b; double c; };
class Base { public: Base():base1Num(123) { cout << "Base::Base" << endl; } virtual ~Base() { cout << "Base::~Base" << endl; } virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; } virtual void h() { cout << "Base::h" << endl; } void ooo(){ cout << "Base::ooo" << endl; } void ppp(){ cout << "Base::ppp" << endl; }
private: virtual void j() { cout << "Base::j" << endl; } int base1Num; };
class Base2 { public: Base2():base2Num(456) { cout << "Base2::Base2" << endl; } virtual ~Base2() { cout << "Base2::~Base2" << endl; } virtual void x() { cout << "Base2::x" << endl; } virtual void y() { cout << "Base2::y" << endl; } void rrr() { cout << "Base2::rrr" << endl; } void sss() { cout << "Base2::sss" << endl; }
private: virtual void z() { cout << "Base2::z" << endl; } int base2Num; };
class dev : public Base , public Base2 { public: virtual void f() { cout << "dev::f" << endl; } virtual void k() { cout << "dev::k" << endl; } virtual void z() { cout << "dev::z" << endl; }
public: int num; char* str; dev* child; Tmp tmp; };
void testVirtualTable() {
dev d; d.num = 100; d.str = "hello world";
d.tmp.a = 31; d.tmp.b = 777; d.tmp.c = 888;
cout << "虚函数表地址:" << (int*)(&d) << endl; cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&d) << endl; printf("\n");
Fun pFun2 = nullptr; pFun2 = (Fun)*((int*)*(int*)(&d) + 1); pFun2(); pFun2 = (Fun)*((int*)*(int*)(&d) + 2); pFun2(); pFun2 = (Fun)*((int*)*(int*)(&d) + 3); pFun2(); pFun2 = (Fun)*((int*)*(int*)(&d) + 4); pFun2(); pFun2 = (Fun)*((int*)*(int*)(&d) + 5); pFun2(); int base1Num = (int)*((int*)(&d) + 1); printf("--- base1Num:%d\n", base1Num); printf("\n");
pFun2 = (Fun)*((int*)*((int*)(&d) + 2) + 1); pFun2(); pFun2 = (Fun)*((int*)*((int*)(&d) + 2) + 2); pFun2(); pFun2 = (Fun)*((int*)*((int*)(&d) + 2) + 3); pFun2(); int base2Num = (int)*((int*)(&d) + 3); printf("--- base2Num:%d\n", base2Num); printf("\n");
int num = (int)*((int*)(&d) + 4); char* str = (char*)*((int*)(&d) + 5); printf("--- dev.num:%d\n", num); printf("--- dev.str:%s\n", str); printf("\n");
printf("--- Tmp size : %d\n", sizeof(Tmp)); printf("--- dev size : %d\n", sizeof(dev));
printf("--- str:0x%x\n", str); Tmp* tmp = (Tmp*)&(*((int*)(&d) + 7)); printf("--- tmp:0x%x\n", tmp); printf("--- tmp.b:%d\n", tmp->b);
short tmpA = (short)*((int*)(&d) + 7); printf("--- tmpA:%d\n", (int)tmpA); int tmpB = (int)*((int*)(&d) + 8); printf("--- tmpB:%d\n", tmpB); int tmpC = (int)*((int*)(&d) + 9); printf("--- tmpC:%d\n", tmp->c);
}
|