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

    文章

    514

    浏览量

    43945
  • C++
    C++
    +关注

    关注

    21

    文章

    2070

    浏览量

    73024
收藏 人收藏

    评论

    相关推荐

    keil用c++编译含有rtos模块时的错误问题怎么解决?

    近期看到一个哥们用c++写嵌入式,感觉蛮有趣,如果当初我的程序要是能用就轻松多了,所以也想尝试一下。虽然不会c++但是还是多少会用简单的class,这个c#上用了不少。我的工程包括u
    发表于 05-09 08:29

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    OpenHarmony C++公共基础库应用案例:Thread

    OpenHarmony C++公共基础库应用案例:Thread 1、程序简介 该程序是基于OpenHarmony的C++公共基础库的线程处理:Thread。 该应用案例已在Open
    发表于 11-22 11:50

    OpenHarmony C++公共基础库应用案例:HelloWorld

    1、程序简介 该程序是基于OpenHarmony的C++公共基础库的简单案例:HelloWorld。 该应用案例已在OpenHarmony凌蒙派-RK3568开发板(即
    发表于 11-22 11:21

    C/C++语言学习大全套

    电子发烧友网站提供《C/C++语言学习大全套.rar》资料免费下载
    发表于 11-18 14:33 0次下载
    C/<b class='flag-5'>C++</b>语言<b class='flag-5'>学习</b>大全套

    迅为itop-3568开发板qt学习手册上新

    的灵魂,C++ 1.3.1对象(的实例化) 1.3.2的函数成员 1.3.3访问修饰
    发表于 10-25 14:32

    迅为RK3568开发板QT学习手册

    ,**《iTOP-3568开发板QT学习手册》**带你打通QT的任督脉。 第1章 C++基础 1.1 C++语言特点 1.1.1 C++
    发表于 10-25 10:29

    C++程序设计精简版

    章 指针第 7 章 自定义数据类型 第 3 篇 基于对象的程序设计第 8 章 和对象第 9 章 关于和对象的进一步讨论第 10 章 运算符重载 第 4 篇 面向对象的程序设计第 11 章 继承与派生第 12 章 多态性与虚
    发表于 10-09 07:26

    嵌入式C/C++语言精华文章集锦

    /C++编程,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组,通过
    发表于 09-25 08:00

    如何为原生C++开发设置Android Studio

    。 为了进一步提高性能,您需要程序集使用程序集代码。 但是,使用ARM Neon内部函数可以避免编写汇编函数的复杂性。 相反,您只需要用C/C++编程并调用arm_neon.h头文件声明的内部函数或
    发表于 08-17 08:28

    C++演示的推理速度比Python演示的推理速度更快是为什么?

    在同一主机机上采用相同型号的 Ran Object Detection C++ 演示 和 对象检测 Python 演示 。 C++ 演示的推理速度比 Python 演示的推理速度
    发表于 08-15 06:52

    _C_访问控制和继承_第1节 #硬声创作季

    函数C++
    充八万
    发布于 :2023年08月11日 11:38:20

    【开源三方库】Aki:一行代码极简体验JS&amp;C++跨语言交互

    ); }); }); 示例:Native与JS对象绑定 示例期望将C++结构体/对象(Person)逻辑注册为JS对象(Person
    发表于 08-07 17:04

    如何为Arm编译Cc++代码

    Studio或Keil MDK IDE环境。 Linux编译常见的编程语言在Arm上得到了很好的支持,大多数开源工具都可以在Linux发行版提供的包中使用。用于C++C和Fortran的商业编译器可从
    发表于 08-02 17:28

    一起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25