标签:
1 /****************************************************************************************************** 2 * File:PolymorphismTest 3 * Introduction:测试多态的一些特性。 4 * Author:CoderCong 5 * Date:20141114 6 * LastModifiedDate:20160113 7 *******************************************************************************************************/ 8 #include "stdafx.h" 9 #include <iostream> 10 using namespace std; 11 class A 12 { 13 public: 14 void foo() 15 { 16 printf("1\n"); 17 } 18 virtual void fun() 19 { 20 printf("2\n"); 21 } 22 }; 23 class B : public A 24 { 25 public: 26 void foo() //隐藏。重写 27 { 28 printf("3\n"); 29 } 30 void fun() //隐藏。重写 31 { 32 printf("4\n"); 33 } 34 }; 35 int main(void) 36 { 37 A a; 38 B b; 39 A *p = &a; 40 p->foo(); //输出1。 41 p->fun(); //输出2。 42 p = &b; 43 p->foo(); //输出1。因为p是基类指针,p->foo指向一个具有固定偏移量的函数。也就是基类函数 44 p->fun(); //输出4。多态。虽然p是基类指针,但实际上指向的是一个子类对象。p->fun指向的是一个虚函数。按照动态类型,调用子类函数 45 B* pB = (B*)&a; 46 pB->foo(); //输出3 47 pB->fun(); //输出2。pB->fun是虚函数,按照动态类型指向基类。 48 return 0; 49 }
4、运行时多态以及虚函数的内部实现
1 class A 2 { 3 public: 4 virtual void FunA() 5 { 6 cout << "FunA1" << endl; 7 }; 8 virtual void FunAA() 9 { 10 cout << "FunA2" << endl; 11 } 12 }; 13 class B 14 { 15 public: 16 virtual void FunB() 17 { 18 cout << "FunB" << endl; 19 } 20 }; 21 class C :public A, public B 22 { 23 public: 24 virtual void FunA() 25 { 26 cout << "FunA1C" << endl; 27 }; 28 };
31 int _tmain(int argc, _TCHAR* argv[]) 32 { 33 C objC; 34 A *pA = &objC; 35 B *pB = &objC; 36 C *pC = &objC; 37 38 printf("%d %d\n", &objC, objC); 39 printf("%d %d\n", pA, *pA); 40 printf("%d %d\n", pB, *pB); 41 printf("%d %d\n", pC, *pC); 42 43 return 0; 44 }
运行结果:
5241376 1563032
5241376 1563032
5241380 1563256
1 class A 2 { 3 public: 4 virtual void FunA() 5 { 6 cout << "FunA1" << endl; 7 } 8 virtual void FunA2() 9 { 10 cout << "FunA2" << endl; 11 } 12 }; 13 14 class C :public A 15 { 16 virtual void FunA() 17 { 18 cout << "FunA1C" << endl; 19 } 20 }; 21 int _tmain(int argc, _TCHAR* argv[]) 22 { 23 A *pA = new A; 24 C *pC = new C; 25 typedef void (*Fun)(void); 26 27 Fun fun= (Fun)*((int*)(*(int*)pA)); 28 fun();//pA指向的第一个函数 29 fun = (Fun)*((int*)(*(int*)pA) +1); 30 fun();//pA指向的第二个函数 31 32 fun = (Fun)*((int*)(*(int*)pC)); 33 fun();//pC指向的第一个函数 34 fun = (Fun)*((int*)(*(int*)pC) + 1); 35 fun();//pC指向的第二个函数 36 return 0; 37 }
运行结果:
1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 C objC; 4 A *pA = &objA; 5 B *pB = &objC; 6 C *pC = &objC; 7 8 typedef void (*Fun)(void); 9 10 Fun fun = (Fun)*((int*)(*(int*)pC)); 11 fun();//第一个表第一个函数 12 fun = (Fun)*((int*)(*(int*)pC)+1); 13 fun();//第一个表第二个函数 14 fun = (Fun)*((int*)(*((int*)pC+1))); 15 fun();<span style="white-space:pre"> </span>//第二个表第一个函数 16 fun = (Fun)*((int*)(*(int*)pB)); 17 fun();//pB指向的表的第一个函数 18 return 0; 19 }
哈哈,和我们的猜测完全一致:
标签:
原文地址:http://www.cnblogs.com/qiaoconglovelife/p/5128523.html