BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #74689同步于 2013/10/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

子类属性覆盖基类同名属性,但输出为什么是这样的?

Mulany
2013/10/22镜像同步11 回复
class A { public: int a; A(){a=1;} void fun(){printf("%d ",a);}; }; class B:public A { public: int a; B(){a=2;} }; void main() { B b; b.fun(); } 为什么输出的是1?B中的属性a应该已经覆盖了A中的a啊? %%%%%%%%%%%%%%%% 下面问题已解决 %%%%%%%%%%%%%%%%%%%%% string arr[]={"Tom","Lily","Lucy"}; printf("%d %d",sizeof(arr),sizeof(string)); 输出是 96 32 输出不应该是三个字符串的长度值和么??求教
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
douzhao333机器人#1 · 2013/10/22
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。 说的是字符串这个数据类型的长度,而不是具体某个字符串的长度。 百度百科:http://baike.baidu.com/link?url=OlZLB5YCUkTAq9tk7WQcMC9z2yIhCSk1xsi84-Js7KPq2zrZZcKHxeDvPYYYLItLY84Gt9lEt0WUhMt-D7alEa
douzhao333机器人#2 · 2013/10/22
你想用的是strlen()吧?
douzhao333机器人#3 · 2013/10/22
sizeof和sizeof(string)的问题 http://www.cnblogs.com/wanghetao/archive/2012/04/04/2431760.html
Mulany机器人#4 · 2013/10/22
不是的 就是sizeof,发现实际输出跟看的书上不一样,所以迷惑了 【 在 douzhao333 的大作中提到: 】 : 你想用的是strlen()吧?
a206206机器人#5 · 2013/10/22
sizeof arr == sizeof arr[0] * eleNum = sizeof string * 3= 32*3 = 96
Mulany机器人#6 · 2013/10/22
嗯 明白了 谢谢 【 在 a206206 的大作中提到: 】 : sizeof arr == sizeof arr[0] * eleNum = sizeof string * 3= 32*3 = 96
elite1189机器人#7 · 2013/10/22
string占32,arr有3个string,故32*3
hdj机器人#8 · 2013/10/22
覆盖的过程是这样的:b.fun(),先在local作用域B中找fun(),没找到,然后在B的外围作用域A找,找到。然后printf("%d ",a)里面的a,先在其local作用域fun()函数里找,没找到,然后再往fun()的外围作用域也就是A找,找到,此时a==1。就算在A里面没找到它也只会往A的外围作用域去找,不会再去B了。你可以试试在A作用域外面定义一个a,把A里面的变量a去掉。看一看,输出什么结果。
Mulany机器人#9 · 2013/10/22
非常感谢,终于解开了这个疙瘩。不知道这种细节性的原理该看什么书才能学到呢?? 【 在 hdj 的大作中提到: 】 : 覆盖的过程是这样的:b.fun(),先在local作用域B中找fun(),没找到,然后在B的外围作用域A找,找到。然后printf("%d ",a)里面的a,先在其local作用域fun()函数里找,没找到,然后再往fun()的外围作用域也就是A找,找到,此时a==1。就算在A里面没找到它也只会往A的外围作用域去找,不会再去B了。你可以试试在A作用域外面定义一个a,把A里面的变量a去掉。看一看,输出什么结果。