虚函数占用对象的存储空间?

bird67 2008-01-23 01:11:20
#include <iostream>
using namespace std;
class Student
{
public:
void display();
int haha;
};

void Student::display()
{
}

class Student1:protected Student
{
public:
int age;
};

int main()
{
Student stud;
Student1 stud1;
cout<<sizeof(stud1)<<endl;
cout<<sizeof(stud)<<endl;
return 0;
}

输出:
8
4

而将上面红色代码部分改为虚函数virtual void display();后,再运行程序,输出结果为:
12
8

为什么会这样呢?是虚函数占用了内存么?但是在第一段程序中再加上一个虚函数,代码如下:
#include <iostream>
using namespace std;
class Student
{
public:
virtual void display();
virtual void display1();
int haha;
};

void Student::display()
{
}
void Student::display1()
{
}

class Student1:protected Student
{
public:
int age;
};

int main()
{
Student stud;
Student1 stud1;
cout<<sizeof(stud1)<<endl;
cout<<sizeof(stud)<<endl;
return 0;
}
运行此程序,结果还是12和8。
为什么呢?
请高手们帮忙解决。
...全文
573 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
星光伴月 2008-01-23
  • 打赏
  • 举报
回复
第二个问题的答案:
假设如楼主所想的那样,空类不占空间的话,那么请看下面的代码:

class A{
public:
show(){cout<<"A"<<endl;
}
class B{
public:
show(){cout<<"B"<<endl;
}
class C{
public:
show(){cout<<"C"<<endl;
}
class D{
public:
show(){cout<<"D"<<endl;
}
int main(){
A a;
B b;
C c;
D d;
a.show();
b.show();
c.show();
d.show();
}

A,B,C,D分别是四个类,在main()函数中的四个实例a,b,c,d的地址肯定相同,但是后面四行分别调用它们的函数show()的时候,就无法区分到底是调用谁的show()函数,为了能够正确调用各自的函数,C++标准规定,类必须占用空间,所以为空类分配一个字节的空间.
yashiro_ 2008-01-23
  • 打赏
  • 举报
回复
Mark.
needallcodes 2008-01-23
  • 打赏
  • 举报
回复
debug下面仔细逛一逛就知道了
bird67 2008-01-23
  • 打赏
  • 举报
回复
第一段问题明白了,谢谢各位的支持。但是第二段问题还不清楚,cnzdgs 说:“类必须要有储存空间,所以对于空类会分配1字节空间。 ”
但是我不是很赞同,因为类还没实例化为对象的时候是不占用内存的。
所以麻烦大家再帮我分析第二段程序,帮我解决这个问题:

为什么Student对象stud的存储空间是1呢?这1字节内存存放的是什么东西呢?


谢谢
silendream 2008-01-23
  • 打赏
  • 举报
回复
我想在这里问一下各位
系统给类分配的这个“虚表”是放在哪里的呢?
他们不是属于类的吗??
int2e 2008-01-23
  • 打赏
  • 举报
回复
楼上几位的答案正点了
哈哈

#include <cstdlib>
#include <iostream>
using namespace std;
class Student
{
public:
virtual void display();
virtual void display1();
virtual void display2();
virtual void display3();
virtual void display4();
int haha;
};

void Student::display()
{
}
void Student::display1()
{
}
void Student::display2()
{
}
void Student::display3()
{
}
void Student::display4()
{
}
class Student1:protected Student
{
public:
int age;
};

int main()
{
Student stud;
Student1 stud1;
cout <<sizeof(stud1) <<endl;
cout <<sizeof(stud) <<endl;
system("pause");
return 0;
}
输出仍然是12和8

如yupengchen951124所讲
编译器会自动在对象里面安插一个指针指向VTable,
VTable中存放虚函数的地址
yupengchen951124 2008-01-23
  • 打赏
  • 举报
回复
一般声名虚函数的时候 编译器会自动在对象里面安插一个指针指向VTable,在32位的机器上面,一个对象会增加4个字节,它是实现面向对象中多态的关键。
taodm 2008-01-23
  • 打赏
  • 举报
回复
去看《深度探索C++对象模型》吧
ghostgorst 2008-01-23
  • 打赏
  • 举报
回复
虚函数不占对象的空间!但是指向虚函数表的指针占4个字节的空间,不论你类里有多少个虚函数,你的对象大小只增加4个字节,你可以试试!
cnzdgs 2008-01-23
  • 打赏
  • 举报
回复
类必须要有储存空间,所以对于空类会分配1字节空间。
cnzdgs 2008-01-23
  • 打赏
  • 举报
回复
我没看你的程序,回答不当请见谅。
一般函数是直接调用其入口地址,而虚函数是通过指针来调用的,在类对象中需要保存每个虚函数的指针,相当于每个虚函数在类中对应一个指针变量。所以对于32位程序,每个虚函数占4字节。
bird67 2008-01-23
  • 打赏
  • 举报
回复
还有一个问题:
#include <iostream>
using namespace std;
class Student
{
public:
void display();
};

void Student::display()
{
}
class Student1:protected Student
{
public:
int age;
};

int main()
{
Student stud;
Student1 stud1;
cout<<sizeof(stud1)<<endl;
cout<<sizeof(stud)<<endl;
return 0;
}

运行此程序,输出结果为
4
1
为什么Student对象stud的存储空间是1呢?这1字节内存存放的是什么东西呢?

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧