今天给新员工培训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更合理的方案吗:)
>> 本文固定链接: http://www.vcgood.com/archives/1419