免费个人网站制作,51com个人主页登陆,宝塔一键部署wordpress最新版,哪些网站可以做店铺推广类的虚表
每个包含了虚函数的类都包含一个虚表。
当一个类#xff08;B#xff09;继承另一个类#xff08;A#xff09;时#xff0c;类B会继承类A的函数的调用权。所以如果一个基类包含了虚函数#xff0c;那么其继承类也可调用这些虚函数#xff0c;换句话说…类的虚表
每个包含了虚函数的类都包含一个虚表。
当一个类B继承另一个类A时类B会继承类A的函数的调用权。所以如果一个基类包含了虚函数那么其继承类也可调用这些虚函数换句话说一个类继承了包含虚函数的基类那么这个类也拥有自己的虚表。
来看以下的代码。类A包含虚函数vfunc1vfunc2由于类A包含虚函数故类A拥有一个虚表。
class A {
public:virtual void vfunc1(){ cout A::vfunc1 endl;}virtual void vfunc2(){ cout A::vfunc2 endl;}void func1();void func2();
private:int m_data1, m_data2;
};
类A的虚表如图1所示。 虚表是一个指针数组其元素是虚函数的指针每个元素对应一个虚函数的函数指针。需要指出的是普通的函数即非虚函数其调用并不需要经过虚表所以虚表的元素并不包括普通函数的函数指针。
虚函数指针的赋值发生在编译器的编译阶段也就是说在代码的编译阶段虚表就可以构造出来了。
虚表是属于类的而不是属于某个具体的对象一个类只需要一个虚表即可。同一个类的所有对象都使用同一个虚表。
虚表指针
为了指定对象的虚表对象内部包含一个虚表的指针来指向自己所使用的虚表。为了让每个包含虚表的类的对象都拥有一个虚表指针编译器在类中添加了一个指针*__vptr用来指向虚表。这样当类的对象在创建时便拥有了这个指针且这个指针的值会自动被设置为指向类的虚表。 上面指出一个继承类的基类如果包含虚函数那个这个继承类也有拥有自己的虚表故这个继承类的对象也包含一个虚表指针用来指向它的虚表。
虚函数表存储位置
首先虚函数表存储在只读数据段.rodata、虚函数存储在代码段.text、虚表指针的存储的位置与对象存储的位置相同可能在栈、也可能在堆或数据段等。 扩展