欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 虚表、虚函数在内存空间分布的哪个位置?

虚表、虚函数在内存空间分布的哪个位置?

2025/9/26 20:22:32 来源:https://blog.csdn.net/weixin_66151870/article/details/145055714  浏览:    关键词:虚表、虚函数在内存空间分布的哪个位置?

分别打印栈、静态区、堆区、常量区变量地址

	int i = 0;static int j = 1;int* p1 = new int;const char* p2 = "123456";printf("栈:%p\n", &i);printf("静态区:%p\n", &j);printf("堆区:%p\n", &p1);printf("常量区:%p\n", &p2);

 构造基类shape,triangle类public继承自shape

class shape
{
public:virtual void draw() {}virtual void count() {}void ordinary_function() {}
};class triangle : public shape
{
public:triangle(int a, int b, int c): _a(a), _b(b), _c(c){}virtual void draw()  {cout << "△" << endl;}virtual void count()  {cout << _a + _b + _c << endl;}
private:int _a;int _b;int _c;
};void Test(shape& s)
{s.draw();s.count();
}

 分别构造基类对象s和派生类对象t,使用shape类型的指针指向s

shape类型的对象指针指向s,如果对该指针此时解引用,得到的将是虚表的地址,对其进行打印即可,我们知道shape对象的大小应该是四个字节(vs2019编译环境下),这四个字节就指向了虚表,解引用的内容也就是虚表地址。

triangle类型的对象指针指向t,我们知道shape对象的大小应该是16个字节(vs2019编译环境下),因为其内部有三个内置类型成员变量,以及一个虚表,我们如果想让指针仅指向这前四个字节大小也就是指向虚表位置,可以将triangle类型对象的指针强转为 int* 类型的指针,对强转之后的指针进行解引用就可以得到以四个字节为单位的地址。(在多继承下可以查看其他虚表地址)

	shape s;  // 基类对象triangle t(1, 2, 3); // 派生类对象	Test(t);shape* p3 = &s;triangle* p4 = &t;printf("shape虚表指针:%p\n", *(int*)p3);printf("shape虚表指针:%p\n", *p3);printf("triangle虚表指针:%p\n", *(int*)p4);printf("虚函数地址: %p\n", &shape::draw);printf("普通函数地址: %p\n", &shape::ordinary_function);

 通过对比,VS编译器下虚表、虚函数存在于常量区(代码段)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词