类成员函数和类成员变量的问题

xiangzi87 2012-10-17 01:24:23
类的成员函数和类的成员变量不是存放在一块的?
类的对象只是他的成员变量所占的空间吗?
是不是就是说如果两个类中的成员变量一样它们的对象就可以相互转换了?
如:class c1{int i,void fun1();};
class c2{int i,void fun2();};
c1 * pc1 = new c1;
c2 * pc2 = (c2 *)pc1;
pc2->fun2;//这样会不会出错;求解释原理?
如果fun1和fun2是内联函数的话是不是一样的结果?
...全文
184 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangzi87 2012-10-18
  • 打赏
  • 举报
回复
那如果类换成结构体行不行的
例如:
struct c1{int i,void fun1();};
struct c2{int i,void fun2();};
c1 * pc1 = new c1;
c2 * pc2 = (c2 *)pc1;
pc2->fun2;//这样会不会出错;求解释原理?
有没有这种写法的????
xiangzi87 2012-10-18
  • 打赏
  • 举报
回复
囧了,转换的那段代码出问题了
juniorli 2012-10-17
  • 打赏
  • 举报
回复
1. 不在一起。成员函数在代码区,成员变量在数据区。
2. 应该还包括成员函数指针所占空间,还要考虑编译器的内存对齐,实际空间计算有些麻烦。
3. 不建议强制转换,后果未知。
max_min_ 2012-10-17
  • 打赏
  • 举报
回复
成员一样的话, 你这样转换是问题不大,但是劝楼主三思啊!这种转换的后果是不能想象的,所以还是不要做这种事情啦!老实点吧
zhuyf87 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

谢谢各位了,看见别人这样转换的所以来问一问,本来也想自己测试一下的,只是想听听大家来解释其中的原理
多谢2楼解释,似乎这样转换是可以的,就是想知道这种转换会不会有没有什么问题?
[/Quote]

至少c++标准或者编译器没有保证这种转换一定会成功吧。所以我觉得尽量不要写这种没有可靠性的代码。
sublimepan 2012-10-17
  • 打赏
  • 举报
回复
需要转换的话,为这两个类定制个转型操作好了,尽量不要强制转换。
yangzhe87 2012-10-17
  • 打赏
  • 举报
回复
相似的结构是可以强制转换的,延长空间就行啊,继承关系的类就可以强制转换啊,其实想问题不用想那么高深的,比如车,小汽车,加点变点东西就可以变(转换)了,但是你不能从车(类)变成猫(类)吧
yangzhe87 2012-10-17
  • 打赏
  • 举报
回复
函数当然占空间了,函数名就占地址啊,要怎么找函数?
结构体struct和类很想的 基本差不多
结构体怎么存的,类就差不多,首地址加偏移量就可以找到所有变量和函数了,很容易举出不能强制转换的列子啊,私有成员不让访问,要是能强制转换不都出问题了,内存不都泄露没了。
xiangzi87 2012-10-17
  • 打赏
  • 举报
回复
谢谢各位了,看见别人这样转换的所以来问一问,本来也想自己测试一下的,只是想听听大家来解释其中的原理
多谢2楼解释,似乎这样转换是可以的,就是想知道这种转换会不会有没有什么问题?
zhuyf87 2012-10-17
  • 打赏
  • 举报
回复
可以看一下《深入探索C++对象模型》
mujiok2003 2012-10-17
  • 打赏
  • 举报
回复
那么多问题。
1, 函数(包括成员函数)放在代码区,变量(包括成员变量)放在数据区,不在一起。
2, 类的实例(对象)大小就是数据成员的大小之和+编译器插入的空间(内存对齐,vptr等)。
3, 类型决定了内存布局和支持的操作。 强制类型转换会不会有问题,因情况而定,一般不建议。

建议继续学习基础知识。
翅膀又硬了 2012-10-17
  • 打赏
  • 举报
回复
函数不占用空间。变量才占空间。你可以强制转换。。问这么多,为什么你不自己试试去呢

65,208

社区成员

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

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