电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
适合具备 C 语言基础的 C++ 教程(五)
分 享
扫描二维码分享
适合具备 C 语言基础的 C++ 教程(五)
C++
wenzi 嵌入式软件
关注
发布时间: 2021-02-20
丨
阅读: 651
# 前言 在上述教程中,我们已经完成了 `C++`相对于 `C`语言来说独特的语法部分,在接下来的教程中,我们将叙述 `C++`中面向对象的语法特性。我们在学习面向对象的这种编程方法的时候,常常会听到这三个词,**封装、继承、派生**,这也是面向对象编程的三大特性,在本节我们将依次阐述封装、继承、派生的具体用法,在这里,我们先叙述的是**封装**这个属性的的相关内容。下图是关于 **封装** 这个特性所包含的一些内容。 ## 封装 下图就是封装所具备的相关特性: ![image-20210209204824118](https://img-blog.csdnimg.cn/img_convert/53897bc48662add8943e9b9a35300f1c.png) 那么上图所示的**抽象出数据成员以及成员函数**具体的含义是什么呢,正如前面教程所述,在前面的教程里,我们选用一个 `Person`类来作为例子进行讲解,其中这个类里我们有 `name`以及`age`,这个也就是我们抽象出来的数据,那抽象出来的成员函数也就是前面教程讲到的`setName()`和`setAge()`函数,在设计这个类的时候,会把这个类的一些成员设置为私有的或者公有的,这也就是访问控制。具体的代码如下所示: ```cpp /@@* 为了代码简便,省略相关构造函数以及析构函数,为的是展示封装的特性*/ class Person { private: char *name; int age; public: Person() { cout << "Person" << endl; name = NULL; } ~Person() { cout << "~Person()" << endl; if (this->name) { delete this->name; } } void setName(char *name) { if (this->name) { delete this->name; } this->name = new char[strlen(name) + 1]; strcpy(this->name, name); } int setAge(int a) { if (a < 0 || a > 150) { age = 0; return -1; } age = a; return 0; } }; ``` ## 继承 继承的含义就如其字面意思一样,用更加专业的话来说,就是从**基类**继承相关属性,而这个新的类就叫做**派生类**。下面这个示意图也表明了继承所带来的代码的简洁与方便。 ![image-20210209211013964](https://img-blog.csdnimg.cn/img_convert/1968ab718db3a88eaedebfffbe69ff47.png) 就如上述这张图所示,一个人肯定具有名字和年龄这两个属性,那作为一个学生来讲,他也必定具备名字和年龄这两个属性,那这个时候是要在 `Student`类里重新定义这些属性么?显然,因为引入了继承这个特性,只需要继承`Person`类,那么`Student`就具备 `Person`类的相关属性。在上述代码的基础上,我们增加如下所示的代码: ```cpp /@@* 注意是在上述代码的基础上 */ class Student : public Person { }; int main(int argc, char **argv) { Student s; s.setName("zhangsan"); s.setAge(16); s.printInfo(); return 0; } ``` 上述代码中,`Student`类是继承自 `Person`类的,我们可以看到在上述所示的`Student`类中,并没有`setName`和 `setAge`的成员函数,但是在定义的 `Student`实例中,却能够适用 `setName`和 `setAge`的成员函数,这也就说明了 `Student`类已经继承了 `Person`类。 ### 继承后的访问控制 #### private 一个派生类从一个基类继承而来,而继承的方式有多种,可以是私有继承,也可以是公有继承,同时也可以是保护继承。那么这个时候基类的各个数据成员的访问属性又是怎么样的呢,我们来看一下下面这张图,其展现了以各种方式继承自基类的派生类的数据成员的属性。 ![image-20210209223145289](https://img-blog.csdnimg.cn/img_convert/54c056ae117e69d6e1fd3efec6c65fe8.png) 从这个表可以清楚地知道基类的访问属性与派生类的访问属性的对应情况。同样的,我们用一个简单的例子来说明这个知识点: ```cpp class Father { private: int money; public: void it_skill(void) { cout << "The father's it skill" <
money = money; } }; ``` 这个是基类的数据成员以及成员函数,为了更好的说明继承后的数据的属性,我们定义一个 `son`类,代码如下所示: ```cpp class Son : public Father { private: int toy; public: void play_game(void) { cout << "play_game()" << endl; int m; //money -= 1; /@@* 错误的代码 */ m = getMoney(); m--; setMoney(m); } }; ``` 上述定义了两个类,一个是 `Father`类,一个是 `Son`类,`Son`类继承于 `Father`类,这两个类用通俗的语言进行解释便是,父亲有自己的私房钱,儿子有自己的玩具,父亲有一项技能是 `it`,儿子呢比较喜欢玩游戏。因为是继承,所以儿子类具有父亲类的相关属性,但是,作为儿子是不能够直接去父亲兜里拿钱的,那会被揍,但是如果儿子需要钱,可以向父亲要。这对应的代码也就是上述中 `money -= 1`,但是这是错误的,不能直接从父亲的兜里拿钱,而剩余的三句代码的意思也就相当于是向父亲要钱。用专业的话来讲也就是:**派生类不能够访问基类的私有成员**,紧接着是主函数的代码: ```cpp int main(int argc, char **argv) { Son s; s.it_skill(); s.setMoney(10); cout << "The money is:" << s.getMoney() << endl; s.play_game(); return 0; } ``` 代码输出的结果如下所示: ![image-20210209232507917](https://img-blog.csdnimg.cn/img_convert/d49de966b134370b5ae93ecdd5011c62.png) #### protected 还是采用比较通俗的话来叙述这一知识点,儿子相对于父亲的关系自然是与其他人有所不同的,比如有一把父亲房间门的钥匙,对于儿子来说是可以拿到的,但是对于外人来说,这是不可访问的。那在程序中要如何实现这么一个功能呢?这里就要引入 `protected`了。代码如下所示: ```cpp class Father { private: int money; protected: int room_key; /@@* 增添的 room_key */ public: void it_skill(void) { cout<<"father's it skill"<
money = money; } }; ``` 我们可以看到在 `Father`类中,增添了一项就是 `protected`修饰的 `room_key`,紧接着我们来看`Son`类的代码: ```cpp class Son : public Father { private: int toy; public: void play_game(void) { int m; cout<<"son paly game"<
上述教程所涉及的代码可以通过百度云链接的方式获取到,下面是百度云链接: > >链接:https://pan.baidu.com/s/18AGYqxkxsEcR4ZW6_Nhevg >提取码:dlst
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
wenzi 嵌入式软件
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交