注册 登录
编程论坛 C++教室

类的继承问题

乔峰不会 发布于 2009-10-23 10:26, 602 次点击
在学类的多态性的时候,会把派生类的对象的地址赋值给基类的指针,
比如 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 的所有成员呢??
  各位大侠帮帮忙,我被困扰好久了,拜托了!!
  请详细解答一下,先谢了。      
4 回复
#2
caolihui10082009-10-23 16:02
好像你那么做编译也通不过呀!怎么将B 类的对象指针付给 指向C类型的指针呢?反过来也不行呀!但是在函数中如 void su(const B&),此时就可以既付给
B类型的 也可给C类型的了。

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

C++我都是自学的,你是哪所学校的?
#3
debroa7232009-10-23 18:28
先得纠正一下,并不是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赋了什么值,上面的代码都可以通过,但有安全性问题,因为你不知道写到什么地方了。观察内存和汇编,会在这方面有进一步的发现。
#4
supermat2009-10-28 15:34
楼上正解
#5
qlc002009-10-28 15:59
学习了!
1