C++ - 继承中的访问级别

1.问题:子类是否可以直接访问父类的私有成员?

答案:子类不能直接访问父类的私有成员! 

代码示例:验证子类不能直接访问父类的私有成员。

编程实验
继承中的访问级别
44-1.cpp
#include <iostream>
#include <string>
 
using namespace std;
 
class Parent
{
private:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }
    
    int value()
    {
        return mv;
    }
};
 
class Child : public Parent
{
public:
    int addValue(int v)
    {
        mv = mv + v;    // ???? 如何访问父类的非公有成员
    }
};
 
int main()
{   
    return 0;
}

结果:编译错误

44-1.cpp:9:6: error: 'int Parent::mv' is private
    int mv;
44-1.cpp:27:3: error: within this context
    mv = mv + v;
错误:'int Parent::mv'是私有的
错误:在这个上下文中有错
    mv = mv + v;

2.继承中的访问级别

-> 面向对象中的访问级别不只是public(公共权限)和private(私有权限)。

-> 可以定义protected(保护权限)访问级别。

关键字protected:

代码示例:protected修饰的成员可以被子类直接访问(被子类成员函数使用)。

编程实验
protected初体验
44-2.cpp
#include <iostream>
#include <string>
 
using namespace std;
 
class Parent
{
protected:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }
    
    int value()
    {
        return mv;
    }
};
 
class Child : public Parent
{
public:
    int addValue(int v)
    {
        mv = mv + v;    
    }
};
 
int main()
{   
    Parent p;
    
    cout << "p.mv = " << p.value() << endl;  //100
    
    Child c;
    
    cout << "c.mv = " << c.value() << endl;    //100
    
    c.addValue(50);
    
    cout << "c.mv = " << c.value() << endl;    //150
    
    return 0;
}

结果:

p.mv = 100
c.mv = 100
c.mv = 150

代码示例:修饰的成员不能被外界直接访问(可以被自身的成员函数使用)。

#include <iostream>
#include <string>
 
using namespace std;
 
class Parent
{
protected:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }
    
    int value()
    {
        return mv;
    }
};
 
class Child : public Parent
{
public:
    int addValue(int v)
    {
        mv = mv + v;    
    }
};
 
int main()
{   
    Parent p;
    
    cout << "p.mv = " << p.value() << endl;  //100
    cout << "p.mv = " << p.mv << endl;   //error: ‘int Parent::mv’ is protected
    p.mv = 1000;    // error。父类自身可以访问数据(成员函数),但是不能修改
    
    Child c;
    
    cout << "c.mv = " << c.value() << endl;    //100
    
    c.addValue(50);
    
    cout << "c.mv = " << c.value() << endl;    //150
    
    c.mv = 10000;  // error
    
    return 0;
}

结果:编译错误

44-2.cpp:9:6: error: 'int Parent::mv' is protected
    int mv;
错误:'int Parent::mv'是被保护的
44-2.cpp:37:25: error: within this context
    cout << "p.mv = " << p.mv << endl;
错误:在这个上下文内有错(不能通过对象直接外部访问保护成员mv)
44-2.cpp:9:6: error: 'int Parent::mv' is protected
    int mv;
错误:'int Parent::mv'是被保护的
44-2.cpp:39:4: error: within this context
    p.mv = 1000;
错误:在这个上下文有错(不能给保护成员mv的赋值)
44-2.cpp:9:6: error: 'int Parent::mv' is protected
    int mv;
 
44-2.cpp:49:4: error: within this context
    c.mv = 10000;
错误:不能给c.mv赋值,因为是被保护的成员

分析:protected修饰的成员不能被外部直接访问,但是可以在自身的成员函数访问或者子类成员函数中访问。

3.定义类时访问级别的选择

小结:

-> 面向对象中的访问级别不只是public和private。

-> protected修饰的成员不能被外界所访问。

-> protected使得子类能够访问父类的成员。

-> protected关键字是为了继承而专门设计的。

-> 没有protected就无法完成真正意义上的代码复用。

public继承时,访问权限:

-> 子类不能访问父类的private成员。

-> 子类可以访问父类的protected成员。

-> 子类可以访问父类的public成员。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值