protected理解

protected一般作为类中关键字出现,在写代码的过程中发现对该关键字有错误的理解。首先先把问题讲清楚。qt中customevent是QObject中的protected修饰的成员,在我的代码中保存了很多QObject类型的对象指针,并且代码中出现了这些对象指针解引用customevent的语句,如下所示:

QList<QOjbect&> obj = ....;
QObject* p = obj[i];
p->customevent(event);  //编译时报错,提示is protected within this context
...

然后修改代码,修改后的代码如下所示:

QList<QOjbect&> obj = ....;
QWidget* pwidget = dynamic_cast<QWidget*>(obj[i]);
pwidget->customevent(event);  /同样编译时报错,还是提示is protected within this context
...

由此可见,自己在这里对protected关键字理解是错误的,protected在记忆中的只是理解为子类可调用,但是平时使用的比较少,至于如何调用则没有深究过,才会造成这样的错误。

首先说明上述错误的原因是对protected关键字理解不准确造成的,认为只要是子类就可以直接调用街垒protected修饰的函数或者成员,此处理解不正确。protected关键字虽然子类可以调用,但是仅限于子类的成员函数可以调用基类protected修饰的成员函数或者成员变量,但是子类对象不能直接调用基类protected修饰的成员函数和成员变量。可以从这个角度去考虑,如果子类对象可以直接调用基类protected修饰的成员函数或者成员变量,那么与public就没有任何区别了,protected关键字就没有任何意义了。

class base
{
    public:
        int a;
    protected:
        int b;
        void func()
{
        cout<<"protected come in"<<endle;
}
    private:
        int c;
};
class son:public base
{
...
void func1()
{
    b = 13;
};
void func2()
{
    func();
};
};
int main()
{
    base A;
    son B;
    A.a = 10;   //正确
    A.b = 11;  //错误,protected修饰的成员变量无法被对象直接调用,否则就会与public一样了
    A.func();  //错误,protected修饰的成员变量无法被对象直接调用,否则就会与public一样了
    B.b = 13;  //错误,子类对象无法直接调用基类中protected修饰的成员变量
    B.func1(); //正确,子类成员可以直接访问基类protected修饰的成员变量
    B.func2();  //正确,子类成员函数可以直接访问基类protected修饰的成员函数
}

另外一点需要注意的是子类继承基类是也有public,protected和private的区别。

我的总结就是public继承原有基类的public、protected和private不变。

protected继承则基类中public修饰的成员变量和成员函数变为protected

private继承的则基类中的public和protected修饰的成员变量或者成员函数都将变为private类型。

通过上述三点的描述,相信大家都能看出一个规律:不同的继承影响的只是权限比当前关键字大的成员变量或者成员函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值