| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 602 人关注过本帖
标题:类的继承问题
只看楼主 加入收藏
乔峰不会
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2009-10-21
结帖率:50%
收藏
 问题点数:0 回复次数:4 
类的继承问题
在学类的多态性的时候,会把派生类的对象的地址赋值给基类的指针,
比如 class B{
            public : int a, b;
            };
    class C : public B{
            public : int c;
            };
    B * b;
    C  c1; C * pc;
    b = &c1;  
  听老师说此时 b 指向了 c1 的地址,就是说保存了c1的全部信息,即如果
  pc = b;那么pc就能访问c1 的全部成员了,也就是pc保存并能访问c1所有的东西了,而 b 就不能访问 c1.c这个成员,但是在执行  B * b; 时,系统规定 b 所保存的地址只有B类的对象那么大(8个字节) ,但是C类的对象却有 12个字节,就是说子类的对象所需的内存空间较大,那么怎么使得 b 这个指针保存 c1 的所有成员呢??
  各位大侠帮帮忙,我被困扰好久了,拜托了!!
  请详细解答一下,先谢了。      
搜索更多相关主题的帖子: 继承 
2009-10-23 10:26
caolihui1008
Rank: 2
来 自:石家庄
等 级:论坛游民
帖 子:33
专家分:75
注 册:2009-10-19
收藏
得分:0 
好像你那么做编译也通不过呀!怎么将B 类的对象指针付给 指向C类型的指针呢?反过来也不行呀!但是在函数中如 void su(const B&),此时就可以既付给
B类型的 也可给C类型的了。

不知道是不是准确,请高手补充。

C++我都是自学的,你是哪所学校的?
2009-10-23 16:02
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
先得纠正一下,并不是b和pc保存了c1的数据,而是它们保存了C1的内存地址,因为它们都是指针嘛。
执行  B * b; 时,系统并没有规定 b 所保存的地址只有B类的对象那么大,因为它是指针,编译器只会知道这是一个B的指针,并不知道它有多大,b不能访问c1.c的原因也是这里,因为编译器只知道这是一个B类的指针,而B类里没有c变量。
由于B是C的父级,要想让b访问到C1的c,就只有强转,
((C*)b)->c;
强转就可以把b指针强行看成C类的指针,这样就可以访问c了。
还好它们有父子关系,这种强转不会引起问题,但也得小心使用
实事上,不管给b赋了什么值,上面的代码都可以通过,但有安全性问题,因为你不知道写到什么地方了。观察内存和汇编,会在这方面有进一步的发现。
2009-10-23 18:28
supermat
Rank: 2
等 级:论坛游民
帖 子:10
专家分:29
注 册:2009-1-19
收藏
得分:0 
楼上正解
2009-10-28 15:34
qlc00
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:157
专家分:540
注 册:2007-11-26
收藏
得分:0 
学习了!

Anything is possible!
2009-10-28 15:59
快速回复:类的继承问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018377 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved