小蔡求教__再次讨论这个继承同名隐藏问题!本帖最后由 jsjisweet 于 2012-11-19 16:58:00 编辑先上代码:#
<小蔡求教>__再次讨论这个继承同名隐藏问题!
本帖最后由 jsjisweet 于 2012-11-19 16:58:00 编辑 先上代码:
#include <iostream> using namespace std;
class A
{ public:
int a;
A(){a=1;}
void print(){printf("%d",a);}
protected:
private:
};
class B:public A
{
public:
int a;
B(){a=2;};
protected:
private:
};
int main()
{ B b;
b.print();
printf("%d",b.a); }
这些天做这些题目把自己搞混乱了,这个题目输出答案居然是:1 2.
这个帖子我上次发过,结贴了,但是今天又碰到类似的题目,所以继续讨论一次。
首先我要说的是,教材上原话:对基类成员的改造包括两个方面,一个是基类成员的访问控制问题,主要依靠派生类定义时的继承方式来控制,第二个是对基类数据成员或函数成员的隐藏,就是在派生类中声明一个和基类数据或函数同名的成员[color=#00FF00]。(c++语言程序设计第三版 郑莉 董渊 第211页)[/color]
再看这题代码:B和A中都有同名 int a;按照意思 应该是同名隐藏,所以第一个输出 b.print()应该是 2 啊,为什么还是1?
上次有 朋友回帖说了,B和A中的a是不同的,B中就相当于有2个a,所以调用print输出为a中的1
我上次就这样记了下 就结贴了。
现在这句话不符合教材上的意思啊,我百度了下 :都是说 子类会覆盖基类同名成员。
所以我发现我自从做了一些这种题目后 我彻底混乱了。希望大家能指导下。
[解决办法]
还有我觉得这里就没有隐藏的概念!
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
这里说的都是对函数而言,没有涉及到成员变量。
