关键词:虚函数表,动态绑定,多态
每个对象都维护自己的虚表指针,指向类的虚函数表。
(所以对象的size比其包含的所有数据size多4,即虚指针大小)
➡️动态绑定:(多态的实现原理)
- 通过指针p找到对象c的vptr
- 通过vptr找到class C的vtbl
- 在vtbl中找到第n个虚函数并调用
➡️子类调用父类函数隐式传入this指针:
myDoc.OnFileOpen();
看似是对象调用函数(静态绑定),但由于调用的是父类的函数CDocument::OnFileOpen()
,且其中嵌套了一个虚函数Serialize()
。- 在调用
Serialize()
时,实际是调用this->Seialize()
,而此时的this
为子类对象myDoc
。 - 即该过程其实为动态绑定,通过子类对象的vptr,找到class
CmyDoc
的虚表,调用重写的Serialize()
函数。
➡️静态绑定&动态绑定:
对象调用函数 | 指针调用函数 |
---|---|
静态绑定 | 动态绑定 |
a.vfunc1(); | pa->vfunc1(); |
a为一个class A对象,调用class A的成员函数 | pa为一个class A指针,接收一个class B对象,运行时通过指针调用虚函数 |