类的虚表
每个包含了虚函数的类都包含一个虚表。
当一个类(B)继承另一个类(A)时,类B会继承类A的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。
来看以下的代码。类A包含虚函数vfunc1,vfunc2,由于类A包含虚函数,服务器托管网故类服务器托管网A拥有一个虚表。
class A {
public:
virtual void vfunc1()
{
cout
类A的虚表如图1所示。
虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。需要指出的是,普通的函数即非虚函数,其调用并不需要经过虚表,所以虚表的元素并不包括普通函数的函数指针。
虚函数指针的赋值发生在编译器的编译阶段,也就是说在代码的编译阶段,虚表就可以构造出来了。
虚表是属于类的,而不是属于某个具体的对象,一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表。
虚表指针
为了指定对象的虚表,对象内部包含一个虚表的指针,来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个指针,*__vptr,用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个指针的值会自动被设置为指向类的虚表。
上面指出,一个继承类的基类如果包含虚函数,那个这个继承类也有拥有自己的虚表,故这个继承类的对象也包含一个虚表指针,用来指向它的虚表。
虚函数表存储位置
首先虚函数表存储在只读数据段(.rodata)、虚函数存储在代码段(.text)、虚表指针的存储的位置与对象存储的位置相同,可能在栈、也可能在堆或数据段等。
扩展:
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 7 年 Android 老油条告诉你:天天工作拧螺丝,如何打破技术瓶颈?
引言 作为在 Android 这个圈子摸爬滚打 7 年的老油条想给你们工作“3~5”年的朋友提点职业上和技术上的建议 其实很多做开发的朋友都会遇到的怪圈。就是当你到某一个阶段,会觉得业务和技术提升都很难,现在的公司待着感觉没有前途混吃等死,想跳槽吧,心里却没底…