0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中类的继承访问级别学习总结(二)

电子设计 来源:电子设计 作者:电子设计 2020-12-24 16:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上一篇文章我们介绍了c++中类的继承学习总结;今天我们继续来分享c++中类的继承中的访问级别的学习总结。

一、继承中的访问级别学习:

1、子类是否可以直接访问父类的私用成员吗?

从面向对象理论角度来看:

子类拥有父类的一切属性和行为,也就是说,子类能够直接访问父类的私有成员。

从c++的语法角度看:

外界不能直接访问类的private成员,也就是说,子类不能直接访问父类的私用成员。

代码示例:

#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;

输出结果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In member function ‘int Child::addValue(int)’:
test.cpp:9:9: error: ‘int Parent::mv’ is private
int mv;

test.cpp:27:9: error: within this context
mv = mv + v; // 如何访问父类的非公有成员

test.cpp:9:9: error: ‘int Parent::mv’ is private
int mv;

test.cpp:27:14: error: within this context
mv = mv + v; // 如何访问父类的非公有成员

注解:我们可以看到子类不能直接访问到父类里面的属性

2、继承中的访问级别关系

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

可以定义protected访问级别

关键字protect的意义

--修饰的成员不能被外界直接访问

-- 修饰的成员可以被子类直接访问

代码实现

#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;

p.mv = 1000; // error

Child c;

cout << "c.mv = " << c.value() << endl;

c.addValue(50);

cout << "c.mv = " << c.value() << endl;

c.mv = 10000; // error

return 0;

运行结果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:9:9: error: ‘int Parent::mv’ is protected
int mv;

test.cpp:37:8: error: within this context
p.mv = 1000; // error

test.cpp:9:9: error: ‘int Parent::mv’ is protected
int mv;

test.cpp:47:7: error: within this context
c.mv = 10000; // error

注解:这里我们把父类的属性private修改成protect,这里我们注意到在子类里面的方法中是可以使用父类中的属性mv了,只不过在int main()函数中,使用父类和子类定义的对象,均不可以对父类中的属性mv进行访问,这一点要注意。

3、为什么面向对象中需要protect?

我们还是用生活中的例子来理解,每个人的个人隐私,是不能泄露的,也就是我们c++中的private关键字;而你身上穿的衣服,每个人都可以知道,也就是c++中的public关键字;最后我们的protect关键字,为啥c++中会需要它,我想还是跟生活中有关(所以说,面向对象的编程,非常贴近生活),比如说,家庭开会,有些事情就不能让外人知道,但是自己家人就可以知道,所以这跟protect关键字的用法非常像,也就是说,protect关键鉴于private和public之间。

4、定义类时访问级别的选择:

注解:从图中我们可以发现,当有发生继承关系时,就考虑使用protect关键字

5、组合和继承的综合运用

说明:Object这个类是被用来继承的;Line和Point两个类进行组合。

代码示例:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class Object

protected:
string mName;
string mInfo;
public:
Object()

mName = "Object";
mInfo = "";

string name()

return mName;

string info()

return mInfo;

};
class Point : public Object

private:
int mX;
int mY;
public:
Point(int x = 0, int y = 0)

ostringstream s;

mX = x;
mY = y;
mName = "Point";

s << "P(" << mX << ", " << mY << ")";

mInfo = s.str();

int x()

return mX;

int y()

return mY;

};
class Line : public Object

private:
Point mP1;
Point mP2;
public:
Line(Point p1, Point p2)

ostringstream s;

mP1 = p1;
mP2 = p2;
mName = "Line";

s << "Line from " << mP1.info() << " to " << mP2.info();

mInfo = s.str();

Point begin()

return mP1;

Point end()

return mP2;

};
int main()

Object o;
Point p(1, 2);
Point pn(5, 6);
Line l(p, pn);

cout << o.name() << endl;
cout << o.info() << endl;

cout << endl;

cout << p.name() << endl;
cout << p.info() << endl;

cout << endl;

cout << l.name() << endl;
cout << l.info() << endl;

return 0;

输出结果:

root@txp-virtual-machine:/home/txp# ./a.out
Object
Point
P(1, 2)
Line
Line from P(1, 2) to P(5, 6)

二、总结:

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

protected修饰的成员不能别外界所访问

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

protected关键字为了继承而专门设计的

没有protected关键字就无法完成真正代码意义上的代码复用了

好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见!

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    526

    浏览量

    45307
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76709
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Cortex-M级别的转换

    一、 简述 Cortex-M 里面有特权级别的概念,不同级别可以设定不同的权限,如何转换特权级别基本是本章的内容。 、操作模式 ARM M 核操作模式有两个: 线程(Thread)模
    发表于 11-19 07:32

    图解码说-六大UML图关系(依赖,继承,实现,关联,聚合,组合)

    UML 图是面向对象设计的 “施工图”,而依赖、继承、实现、关联、聚合、组合这六大关系,就是图中定义互动规则的核心 “语法”。掌握它们,就能快速看懂
    的头像 发表于 11-05 09:03 322次阅读
    图解码说-六大UML<b class='flag-5'>类</b>图关系(依赖,<b class='flag-5'>继承</b>,实现,关联,聚合,组合)

    【HarmonyOS 5】鸿蒙的UIAbility详解(

    【HarmonyOS 5】鸿蒙的UIAbility详解() ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融应用 (金融理财# 一、前言 今天我们继续深入讲解
    的头像 发表于 07-11 18:17 684次阅读
    【HarmonyOS 5】鸿蒙<b class='flag-5'>中</b>的UIAbility详解(<b class='flag-5'>二</b>)

    基于LockAI视觉识别模块:C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。本文档展示了如何使用lockzhiner_vision_module::PaddleDet进行目标检测,并通过lockzhiner_vision_module::Visualiz
    的头像 发表于 06-06 13:56 607次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>C++</b>目标检测

    如何从 Microsoft Visual C++ 应用程序 (CyAPI.h) 访问 CYUSB3014 芯片组的 i2c 接口?

    1. 如何从 Microsoft Visual C++ 应用程序 (CyAPI.h) 访问 CYUSB3014 芯片组的 i2c 接口? 我在定制相机中使用 CYUSB3014。 当我开发我的相机
    发表于 05-19 07:21

    使用C++的CyAPI编写的应用程序上遇到了问题,求解决

    我在使用 C++ 的 CyAPI 编写的应用程序上遇到了问题。 我将 XferData() 方法与其他所有端点类型一起使用,没有遇到任何问题。 但是,将其与 Endpoint0 一起使用会引发
    发表于 05-13 06:11

    C++学到什么程度可以找工作?

    C++开发的工作不仅需要深厚的编程功底,还要具备解决实际问题的能力,以及良好的沟通能力和团队协作精神。此外,持续学习和更新自己的知识体系也是保持竞争力的关键。
    发表于 03-13 10:19

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码获得的结果与 Python* 代码不同。
    发表于 03-06 06:22

    基于OpenHarmony标准系统的C++公共基础库案例:ThreadPoll

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础库的线程池处理:ThreadPoll。本案例完成如下工作:创建1个线程池,设置该线程池内部有1024个线程空间。启动5个线程
    的头像 发表于 02-10 18:09 599次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础<b class='flag-5'>类</b>库案例:ThreadPoll

    基于OpenHarmony标准系统的C++公共基础库案例:Semaphore

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础库的线程处理:Sempahore。本案例完成如下工作:(1)无名信号量使用方法定义1个无名信号量,1个供无名信号量管理
    的头像 发表于 02-10 18:08 632次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础<b class='flag-5'>类</b>库案例:Semaphore

    SQLite数据访问组件

    SQLite 数据访问组件 SQLite 数据访问组件 (LiteDAC) 是一个组件库 它提供从 Delphi 和 C++ Builder 到 SQLite 的原生连接,包括 Community
    的头像 发表于 02-08 11:48 821次阅读
    SQLite数据<b class='flag-5'>访问</b>组件

    从Delphi、C++ Builder和Lazarus连接到MySQL数据库

      从 Delphi、C++ Builder 和 Lazarus 连接到 MySQL 数据库 MySQL 数据访问组件(MyDAC)是一个组件库,提供从 Delphi 和 C++ Builder
    的头像 发表于 01-20 13:47 1316次阅读
    从Delphi、<b class='flag-5'>C++</b> Builder和Lazarus连接到MySQL数据库

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序。Spire.XLS for C+
    的头像 发表于 01-14 09:40 1297次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    EE-112:模拟C++实现

    电子发烧友网站提供《EE-112:模拟C++实现.pdf》资料免费下载
    发表于 01-03 15:15 0次下载
    EE-112:模拟<b class='flag-5'>C++</b><b class='flag-5'>中</b>的<b class='flag-5'>类</b>实现

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    )开发框架。它极大地简化了JS与C/C++之间的跨语言访问,为开发者提供了一种边界性编程体验友好的解决方案。通过AKI,开发者可以使用让代码更易读的语法糖,实现JS与C/
    发表于 01-02 17:08