读书人

求问输出结果并给出原因多谢

发布时间: 2013-08-13 16:43:28 作者: rapoo

求问输出结果并给出原因,谢谢

#include <iostream>

using namespace std;

class A
{
public:
int _a;
A()
{
_a=1;
}

void print()
{
printf("%d",_a);
}
};

class B :public A
{
public:
int _a;//////有没有这一语句,程序输出结果是不一样的,请问是为什么
B()
{
_a=2;
}

};

int main()
{
B b;
b.print();
printf("%d",b._a);
}

[解决办法]
name hiding,派生类的名字会覆盖基类的名字,所以 b.print(); 中的 _a 永远是 A::_a,但是printf("%d",b._a); 中的 _a,一会是 A::_a,一会是 B::_a.
[解决办法]
B中定不定义int _a的区别在于要不要从A中继承。
[解决办法]
引用:
Quote: 引用:

有这一句,输出2,没有输出1.因为派生类使用了基类的成员

我用vc6.0跑这个程序的话,B中有int _a;,输出结果是1 2;没有这一句的话输出结果是2 2,(这里的b.print()也输出的)、

是这样的。
B中有int _a, 那么 A::_a 和 _a是2个不同的变量,当然输出1 2
B中没有int _a, 那么只有1个A:: _a,在B中A::_a 和 _a是等价的,输出 2 2

[解决办法]

1)
子类中使用了和父类变量同名的变量,同名的变量的名字就没有办法继承了,只能通过父类的名字才能访问了。
父类的同名变量被隐藏了。
从这个意义上说,3楼的说法也没有错误。

2)由于继承时,父类的所有成员变量,在子类中占有相同的空间,实际上 整个父类的所有成员变量,都被继承下来了,只有可不可以访问和访问方式的问题。
从这个意义上说,成员变量是完全继承了下来,子类的长度>= 父类的长度。


读书人网 >C++

热点推荐