C++中虚函数的实现机制主要是VTable和虚指针。详细如下:
class A {
public:
virtual void f1();
virtual void f2();
private:
int a;
}
class B {
public:
void f1();
private:
int b;
}
如上A,B两个类,编译器为A类准备了一个虚表VTableA如下:
A::f1的地址 |
A::f2的地址 |
编译器为B类准备的VTableB如下:
B::f1的地址 |
A::f2的地址 |
B类重写了f1,所以类B的VTable中记录的是B::f1()的入口地址,而f2是从A继承下来的,所以f2还是用A::f2的入口地址。
当定义B b = new B()时,编译器分配空间时,还会分配一个虚指针vptr指向B的VTable。
所以当使用如下语句:
A *pA = &b; pA->f1();
编译器知道,f1是一个virtual成员函数,其入口地址放在表格的第一项,所以会转换为call*(pA->vptr)[0]。而这一项是放置B::f1的入口地址。
就实现了多态。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 20:46:37