C++(笔记)浅谈protected

本文深入解析C++中protected关键字的作用及使用场景。介绍了protected成员如何介于public与private之间,既能在派生类中访问,又对普通类用户隐藏。并通过代码示例详细说明了派生类及其友元如何正确访问基类的protected成员。

一个类使用protected关键字来声明是希望与派生类分享但是不想被其他公共访问使用的成员。所以protected可以看做public和private的中间产物

解析protected

1.类似于私有成员,受保护的成员对于类的用户(类的用户即类的对象)来说是不可访问的,也就是说可以通过类的成员函数访问而不能通过类的对象来访问
2.类似于公有成员,受保护的成员对于派生类的成员和友元来说是可访问的,而private基类成员对于派生类成员和友元是不能访问的
3.派生类的成员或友元只能通过派生类的对象来访问基类受保护成员,而派生类对基类的对象受保护成员—无权限

代码解析第三点

1.

#include <iostream>
using namespace std;


class Base
{
protected:
    int prot_mem;   
};

class Derive:public Base
{
public:
    friend void Call(Derive &a);//能访问Derive::prot_mem 
    //friend void Call(Base &b);//不能访问Base::prot_mem 
private:
    int j;      
};

void Call(Derive &a)
{
    a.j=a.prot_mem=0;
    cout<<a.j<<endl;
}

//void Call(Base &b)
//{
//  b.prot_mem=0;
//  cout<<b.prot_mem=0;
//}
int main()
{
    Derive c;
    Call(c);
    //Base d;
    //Call(d);
    return 0;
}

//友元或派生类可以访问Derive对象的private和protected成员(这里的成员包括基类中的) 

结果
这里写图片描述

2.

若检查是否能访问Base对象的protected

#include <iostream>
using namespace std;


class Base
{
protected:
    int prot_mem;   
};

class Derive:public Base
{
public:
    friend void Call(Derive &a);//能访问Derive::prot_mem 
    friend void Call(Base &b);//不能访问Base::prot_mem 
private:
    int j;      
};

void Call(Derive &a)
{
    a.j=a.prot_mem=0;
    cout<<a.j<<endl;
}

void Call(Base &b)
{
    b.prot_mem=0;
    cout<<b.prot_mem=0;
}
int main()
{
    Derive c;
    Call(c);
    Base d;
    Call(d);
    return 0;
}

**这段代码是不能通过编译的因为在派生类中的友元函数访问Base对象的protected了即这里写图片描述


浅谈代码

重点在于两个友元(不用也可以)能否访问Derive对象的private和protected成员和能否访问Base对象的protected成员


权限解释

  • 因为派生类(及其友元)但友元又不是基类的友元,那么若派生类(及其友元)能改变Base对象的内容,那我们只要定义一个形如Derive的新类就能简单躲避protected提供的访问权限了,但这显然是不对的,并不是protected的初衷
  • 派生类的成员和友元只能访问派生类对象中其类受保护成员,对于普通的基类对象中的成员不具备特殊访问权限

部分参照c++ primer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值