
1 using namespace std; 2 #include <iostream> 3 4 using namespace std; 5 6 class A{ 7 public: 8 virtual void Fun1(){ 9 cout << "A::Func1" << endl; 10 } 11 12 virtual void Fun2(){ 13 cout << "A::Func2" << endl; 14 } 15 }; 16 17 class B : public A{ 18 public: 19 virtual void Fun1(){ 20 cout << "B::Func1" << endl; 21 } 22 23 virtual void Fun3(){ 24 cout << "B::Func3" << endl; 25 } 26 }; 27 28 class C : public B{ 29 public: 30 virtual void Fun1(){ 31 cout << "C::Func1" << endl; 32 } 33 34 virtual void Fun4(){ 35 cout << "C::Func4" << endl; 36 } 37 }; 38 39 typedef void(*FUNC)(); 40 int main() 41 { 42 A a; 43 cout << "A::虚表" << endl << endl; 44 ((FUNC)(*(long*)(*(long*)(&a))))(); 45 ((FUNC)(*((long*)(*(long*)(&a)) + 1)))(); 46 cout << "------------------------" << endl; 47 48 B b; 49 cout << "B::虚表" << endl << endl; 50 ((FUNC)(*(long*)(*(long*)(&b))))(); 51 ((FUNC)(*((long*)(*(long*)(&b)) + 1)))(); 52 ((FUNC)(*((long*)(*(long*)(&b)) + 2)))(); 53 cout << "------------------------" << endl; 54 55 C c; 56 cout << "C::虚表" << endl << endl; 57 ((FUNC)(*(long*)(*(long*)(&c))))(); 58 ((FUNC)(*((long*)(*(long*)(&c)) + 1)))(); 59 ((FUNC)(*((long*)(*(long*)(&c)) + 2)))(); 60 ((FUNC)(*((long*)(*(long*)(&c)) + 3)))(); 61 cout << "------------------------" << endl; 62 return 0; 63 }
虚函数表继承替换原则:
有则替换, 无则末尾追加。