虚函数表

来源:互联网 发布:360手机网络修复器 编辑:程序博客网 时间:2024/06/11 06:01

虚表只存的地址

class Base
{
public:
virtual void func1()
{}
virtual void func2()
{}
private:
int a;
};
void Test1()
{
Base b1;//虚函数表指针_vfptr,虚函数的重写,完成多态,指向虚函数的一张表,其实是个数组,指针数组,存的虚函数的地址
cout << sizeof(b1) << endl;//b1是多大呢?如果是64位程序,就是12个字节,平台很重要,一般是8
}
int main()
{
Test1();
system("pause");
return 0;
}

虚函数表如下:


程序改进如下:

class Base
{
public:
virtual void func1()
{
cout << "Base::func1"<<endl;
}
virtual void func2()
{
cout << "Base::func2" << endl;
}
private:
int a;
};
class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}
virtual void func3()
{
cout << "Derive::func3" << endl;
}
virtual void func4()
{
cout << "Derive::func4" << endl;
}//func3和func4去哪了?编译器的优化,也算是编译器的bug,它在但是没显示,用内存看一下
private:
int b;
};

这里构成单继承对象模型:


写个函数打印出虚函数表如下:

class Base
{
public:
virtual void func1()
{
cout << "Base::func1"<<endl;
}
virtual void func2()
{
cout << "Base::func2" << endl;
}
private:
int a;
};
class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}
virtual void func3()
{
cout << "Derive::func3" << endl;
}
virtual void func4()
{
cout << "Derive::func4" << endl;
}//func3和func4去哪了?编译器的优化,也算是编译器的bug,它在但是没显示,用内存看一下
private:
int b;
};
typedef void(*V_FUNC)();
void PrintVTable(int* vtable)//传虚表,打印虚函数表
{
printf("虚函数表:%p\n", vtable);
for (size_t i = 0; vtable[i] != 0; ++i)
{
printf("vfunc[%d]:%p->", i, vtable[i]);
V_FUNC f = (V_FUNC)vtable[i];
f();
}
}
int main()
{
Base b;
Derive d;
int * vtable = (int*)*(int*)&d;//区地址,强转,解引用为int,头结点,在再强转为int*
PrintVTable(vtable);
PrintVTable((int*)(*((int*)&b)));
system("pause");
return 0;
}


由此可以看出虚函数表中未能显示的func3和func4的地址。

原创粉丝点击