<小蔡求教>再次讨论这个继承同名隐藏有关问题

小蔡求教__再次讨论这个继承同名隐藏问题!本帖最后由 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
我上次就这样记了下 就结贴了。

 现在这句话不符合教材上的意思啊,我百度了下 :都是说 子类会覆盖基类同名成员。

所以我发现我自从做了一些这种题目后 我彻底混乱了。希望大家能指导下。
[解决办法]
引用:
本帖最后由 jsjisweet 于 2012-11-19 16:58:00 编辑先上代码:


CSS code?



123456789101112131415161718192021

#include <iostream> using namespace std;  class A  { public:      int a;      A(){a=1;}      vo……


还有我觉得这里就没有隐藏的概念!

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

这里说的都是对函数而言,没有涉及到成员变量。