[C++] 多态(下) -- 多态原理 -- 动静态绑定

小明 2025-04-29 05:04:47 5

文章目录

  • 1、多态原理
  • 2、动态绑定和静态绑定
  • 3、单继承和多继承关系的虚函数表
    • 3.1 单继承中的虚函数表
    • 5.2 多index.php/tags-41973.html" class="superseo">���承中的虚函数表

      上一篇文章我们了解了虚函数表,虚函数表指针,本篇文章我们来了解多态的底层原理,更好的理解多态的机制。

      [C++] 多态(上) – 抽象类、虚函数、虚函数表

      1、多态原理

      下面这段代码中,Func函数传Person调用的Person::BuyTicket,传Student调用的是Student::BuyTicket,这就是多态调用,但是这里我们并不知道原理是什么,接下来我们就来了解一下原理。

      class Person 
      {
      public:
      	virtual void BuyTicket() 
      	{ 
      		cout 
      public:
      	virtual void BuyTicket() 
      	{ 
      		cout 
      	p-BuyTicket();
      }
      int main()
      {
      	Person p;
      	Func(&p);
      	Student s;
      	Func(&s);
      	return 0;
      }
      
      public:
      	virtual void func1()
      	{
      		cout 
      		cout 
      public:
      	virtual void func1() 
      	{ 
      		cout  
      		cout  
      		cout 
      	Base b;
      	Derive d;
      	return 0;
      }
      
      	// 依次取虚表中的虚函数指针打印并调用。调用就可以看出存的是哪个函数
      	cout 
      		printf(" 第%d个虚函数地址 :0X%x,-", i, vTable[i]);
      		VFPTR f = vTable[i];
      		f();
      	}
      	cout 
      	Base b;
      	Derive d;
      	VFPTR* vTableb = (VFPTR*)(*(int*)&b);
      	PrintVTable(vTableb);
      	
      	VFPTR* vTabled = (VFPTR*)(*(int*)&d);
      	PrintVTable(vTabled);
      	
      	return 0;
      }
      
      public:
      	virtual void func1() 
      	{ 
      		cout  
      		cout 
      public:
      	virtual void func1() 
      	{ 
      		cout 
      		cout 
      public:
      	virtual void func1() 
      	{ 
      		cout  
      		cout 
      	cout 
      		printf(" 第%d个虚函数地址 :0X%x,-", i, vTable[i]);
      		VFPTR f = vTable[i];
      		f();
      	}
      	cout 
      	Derive d;
      	VFPTR* vTableb1 = (VFPTR*)(*(int*)&d);
      	PrintVTable(vTableb1);
      	VFPTR* vTableb2 = (VFPTR*)(*(int*)((char*)&d + sizeof(Base1)));
      	PrintVTable(vTableb2);
      	return 0;
      }
      
The End
微信