当在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更合理的方案吗:) 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值