[C++] 多态(下) -- 多态原理 -- 动静态绑定
文章目录
- 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