ObjectModel
vptr(虚指针)&&vtable(虚表)「虚机制」
对象模型在底层内存的分析
先上代码:
class a{
public:
virtual void virtual_func1();
virtual void virtual_func2();
void func1();
void func2();
private:
int m-data1,m-data2;
}
class b:public a{
public:
virtual void virtual-func1();
void func3();
private:
int m-data3;
}
class c:public b{
public:
virtual void virtual-func1();
void func4();
private:
int m-data1,m-data2;
}
图表达的类对象在内存中的分布是真实存在的,从图中可以看出类中含有一个以上的虚函数并且类和类之间有继承关系时(函数的继承不是指继承函数所占内存大小,而是指继承函数调用权),类内会有多出一个指针(虚指针) 指向 虚表,子类没有重写(OverRide)的虚函数都会指向同一个虚函数(相同地址),而子类重写的虚函数会被重新分配一个地址.编译器看到有指针指向的类使用虚函数时就进行图示调用(动态绑定),即指向对象的p指针通过指向虚表的vptr找到指向虚函数的vtable最后找到想要调用函数地址,虚函数的调用解释称成C形式的代码如下所示:
*(ptr->vptr)[n](p) (*ptr->vptr[n])(p)
总结
- C++编译器看到函数就会判断进行的是静态绑定还是动态绑定,而动态绑定(虚机制)的条件为:1.必须通过指针调用 2.指针是向上转型(up-cast) 3.调用的是虚函数
- 虚机制的作用:面向对象的多态性(同一个父类的不同子类有不同的行为通过重写虚函数实现)
|