虚指针,虚表
虚机制
C++编译器遇到函数调用
-
静态绑定,编译为
call 0x*****
(直接转到函数所在地址) -
动态绑定
- 通过指针p调用
- 基类类型的指针被赋子类指针值(可以向上转型)
- 调用的函数是虚函数
通过虚机制 编译为
(*(p->vptr)[n])(p)
,通过基类指针p找到对象所在类的虚函数表(p->vptr
),在表中找到对应的函数指针([n]
n取决于虚函数定义的顺序,第一个为0),通过该函数指针调用(最后(p)p就是this pointer
)
模板方法模式(Template Method)
Class A
{
void fun();
virtual void method();
};
void A::fun()
{
···
method();
···
}
class B:public A
{
virtual void method()
{
···
}
}
main()
{
B b;
b.fun();
}
父类的方法延迟到子类去实现
b.fun()
即A::fun(&b)
,b作为this pointer,在A::fun()
中调用method()
时,即this->method()
,此时满足动态绑定的条件,根据根据this找到虚指针->找到虚表->函数指针->调用
(* (this->vptr)[n])(this)
将可能被继承的父类析构函数定义为虚函数:当new一个子类,然后用父类的指针指向子类时,free(该指针)时,调用析构函数能释放子类空间,防止内存泄漏