首页 > C/C++语言 > C/C++基本语法 > 当在C++子类中重定义基类数据成员时
2006
12-22

当在C++子类中重定义基类数据成员时

今天给新员工培训C++ OOP时, 讲了很多函数重定义的内容, 忽然下面提出一个关于数据成员重定义的问题,虽然不算很难,或者说比较基础,但我还真不清楚了。。。


class Base
{
public:
    int m_i;
};


class Derived: public Base
{
public:
   int m_i;
}


Derived oDerived;
oDerived.m_i = 1;


问题是:上面这种情况,oDerived.m_i = 1被赋值的m_i到底是哪一个,子类还是基类中的, 为什么?


我一看到这个问题,就想, 这题问到”点子“上了, 因为我对这题就有不少疑问:
1) 在子类中重定义数据成员,编译器允许吗?
2) 如果编译器允许,oDerived.m_i指的是哪个呢?
3) 直觉告诉我oDerived.m_i访问的是子类中的m_i,那基类中的怎么访问呢?


于是我说, 我们写代码来验证一下吧 :)


结果,问题的答案如下:
1) 这种语法是允许的
2) oDerived.m_i指的是在子类中定义的那个m_i
3) oDerived.Base::m_i访问的才是基类的m_i


至于为什么oDerived.m_i访问的是子类的m_i,我也不知道答案, 我只是想觉得,假如让你设计C++, 为了分别访问子类,基类的m_i, 你能找出比oDerived.m_i, oDerived.Base::m_i更合理的方案吗:) 


留下一个回复