临沂达内教育
服务热线:400-008-6280
当前位置>临沂达内教育

临沂C/C++语言培训班

临沂C/C++语言培训班

  • 上课时段:见详情
  • 教学点:1个
  • 开班时间:随到随学
  • 课程价格:请咨询
  • 已关注:841
  • 优惠价格:请咨询
  • 咨询电话: 400-008-6280
授课学校:临沂达内教育 (点击获取校区地址)

课程介绍

临沂C/C++语言培训机构,地址,电话,北京达内教育

       临沂C/C++语言培训相关资料:

  C++ 成员函数的重载,继承,覆盖和隐藏

  一、 C++成员函数的重载

  C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数。

  (1) void func(int a);(2) virtual void func(int a);(3) void func(int a) const;

  如果在一个类中,声明这四种函数,哪是重复定义?哪些是重载?

  其中(1)(2)是重复定义,故编译不能通过,而(3)与(1)(2)是不同类型的函数,是重载。

  成员函数被重载的特征是:

  (1)具有相同的作用域(即同一个类定义中);(2)函数名字相同(3)参数类型,顺序 或 数目不同(包括const参数和非const函数)(4)virtual关键字可有可无。

  从成员函数的重载特征中,可以知道(1)(2)是重复定义。那么(3)为什么和(1)(2)不同呢?

  因为类中的函数,都会自动添加一个自身类指针this,所以

  void func(int a) ==== void func(Base * this, int a)virtual func(int a) ==== virtual func(Base *this, int a)void func(int a)const === void func(const Base *this, int a) const

  所以(3)可以与(1)(2)发生重载,因为参数有一个const。

  二 、C++成员函数的继承#include <iostream> using namespace std; class Base { public:     void f(int a){         cout << "Base::f(int a)" << endl;     }     virtual void g(int a) {         cout << "virtual Base::g(int a)" << endl;     } }; class Derived : public Base { public:     void h(int a) {         cout << "Derivd::h(int a)" << endl;     } }; int main() {     Base b;     b.f(3);     b.g(4);     Derived d;     d.f(3);     d.g(4);     d.h(3); } #include <iostream>using namespace std;class Base {public: void f(int a){  cout << "Base::f(int a)" << endl; } virtual void g(int a) {  cout << "virtual Base::g(int a)" << endl; }};class Derived : public Base{public: void h(int a) {  cout << "Derivd::h(int a)" << endl; }};int main(){ Base b; b.f(3); b.g(4); Derived d; d.f(3); d.g(4); d.h(3);}

  Base b的对象模型:

  Derived d的对象模型:

  则在子类Derived d中继承了父类中的virtual void g(int a) ; void f(int a);

  运行结果为:

  三、C++成员函数的覆盖

  覆盖是指派生类重新实现(或者改写)了基类的成员函数,其特征是:

  (1)不同的作用域(非别位于派生类和基类中);(2)函数名称相同(3)参数列表完全相同;(4)基类函数必须是虚函数。

  从(4)中我们得知覆盖只是针对虚函数的。

  #include <iostream> using namespace std; class Base { public:     void f(int a){         cout << "Base::f(int a)" << endl;     }     virtual void g(int a) {         cout << "virtual Base::g(int a)" << endl;     } }; class Derived : public Base { public:     void h(int a) {         cout << "Derivd::h(int a)" << endl;     }     virtual void g(int a) {         cout << "virtual Derived::g(int a)" << endl;     } }; int main() {     Base b;     b.f(3);     b.g(4);     Derived d;     d.f(3);     d.g(4);     d.h(3); } #include <iostream>using namespace std;class Base {public: void f(int a){  cout << "Base::f(int a)" << endl; } virtual void g(int a) {  cout << "virtual Base::g(int a)" << endl; }};class Derived : public Base{public: void h(int a) {  cout << "Derivd::h(int a)" << endl; } virtual void g(int a) {  cout << "virtual Derived::g(int a)" << endl; }};int main(){ Base b; b.f(3); b.g(4); Derived d; d.f(3); d.g(4); d.h(3);}

  Derived d对象模型如下:

  其中Derived中重新定义了基类的虚成员函数virtual void g(int a);

  四、C++成员函数的隐藏

  隐藏是指派生类的成员函数遮蔽了与其同名的基类成员函数,具体规则如下:

  (1) 派生类的函数与基类的函数同名,但是参数列表有所差异。此时,不论有无virtual关键字,基类的函数在派生类中将被隐藏。(注意别与重载混合)

  (2)派生类的函数与基类的函数同名,参数列表也相同,但是基类函数没有virtual关键字。此时,基类的函数在派生类中将被吟唱。(注意别与覆盖混合)

  判断下面哪些函数是覆盖,哪些函数是隐藏?

  #include <iostream> using namespace std; class Base { public:     virtual void f(float x) {         cout << "virtual Base::f(float) " << x << endl;     }     void g(float x) {         cout << "Base::g(float) " << x << endl;     }     void h(float x) {         cout << "Base::h(float) " << x << endl;     } }; class Derived : public Base{ public:     virtual void f(float x) {         cout << "virtual Derived::f(float) " << x << endl;     }     void g(int x) {         cout << "Derived::g(int) " << x << endl;     }     void h(float x) {         cout << "Derived::h(float) " << x << endl;     } }; int main(void) {     Derived d;     Base *pb = &d;     Derived *pd = &d;     pb->f(3.14f);     pd->f(3.14f);     pb->g(3.14f);     pd->g(3.14f);     pb->h(3.14f);     pd->h(3.14f); } #include <iostream>using namespace std;class Base {public: virtual void f(float x) {  cout << "virtual Base::f(float) " << x << endl; } void g(float x) {  cout << "Base::g(float) " << x << endl; } void h(float x) {  cout << "Base::h(float) " << x << endl; }};class Derived : public Base{public: virtual void f(float x) {  cout << "virtual Derived::f(float) " << x << endl; } void g(int x) {  cout << "Derived::g(int) " << x << endl; } void h(float x) {  cout << "Derived::h(float) " << x << endl; }};int main(void){ Derived d; Base *pb = &d; Derived *pd = &d; pb->f(3.14f); pd->f(3.14f); pb->g(3.14f); pd->g(3.14f); pb->h(3.14f); pd->h(3.14f);}

  其中子类Derived中 vitual void f(float x)  是覆盖,而void g(int x) 和void h(float x)都是隐藏。

  运行结果:

  再看一个例子:

  #include <iostream> using namespace std; class Base { public:     virtual void f(int a) {         cout << "virtual Base::f(int a)" << endl;     }     void f(double d) {         cout << "Base::f(double d)" << endl;      } }; class Derived : public Base { public:     void f(double d) {         cout << "Derivd::f(double d)" << endl;     } }; int main() {     Derived d;     d.f(3);     d.f(2.5);     Derived *pd = new Derived();     pd->f(3);     pd->f(2.5);     Base b;     b.f(5);     b.f(3.5);     Base *pBase = new Derived();     pBase->f(5);     pBase->f(3.5); } #include <iostream>using namespace std;class Base{public: virtual void f(int a) {  cout << "virtual Base::f(int a)" << endl; } void f(double d) {  cout << "Base::f(double d)" << endl; }};class Derived : public Base{public: void f(double d) {  cout << "Derivd::f(double d)" << endl; }};int main(){ Derived d; d.f(3); d.f(2.5); Derived *pd = new Derived(); pd->f(3); pd->f(2.5); Base b; b.f(5); b.f(3.5); Base *pBase = new Derived(); pBase->f(5); pBase->f(3.5);}

  其中父类中的void f(double d)隐藏了子类的virtual void f(int a),  void f(double d)函数。

  所以在主函数中

  Derived d; d.f(3); d.f(2.5); Derived *pd = new Derived(); pd->f(3); pd->f(2.5); Derived d;d.f(3);d.f(2.5);Derived *pd = new Derived();pd->f(3);pd->f(2.5);只要通过Derived对象或者Derived指针执行f()函数,都只执行void Derived::f(double d)该函数。[html]Base *pBase = new Derived(); pBase->f(5); pBase->f(3.5); Base *pBase = new Derived();pBase->f(5);pBase->f(3.5);

  在调用pBase->f(5)时,首先要去pBase类中找到对应需要执行的函数,因为Base类中有两个函数virtual void f(int a) 和 void f(double)重载,因为该实参是5,为int类型,所以要调用virtual void f(int a)函数,因为该f(int a)是一个虚函数,所以再去判断pBase所指向的具体对象,具体对象为Derived子类,再去Derived子类的虚函数表中找到void f(int a)函数。因为Derived子类继承了父类Base的虚函数vitural void f(int a),所以输出 virtual Base::f(int a);

  在调用pBase->f(3.5)时,首先要去pBase类中找到对应需要执行的函数,因为因为Base类中有两个函数virtual void f(int a) 和 void f(double)重载,因为该实参是3.5,为double类,所以要调用void f(double d)函数,因为该函数是一个普通成员函数,故直接输出。 void Base::f(double d);

  再举一个例子:

  #include <iostream> using namespace std; class Base { public:     virtual void f(int a) {         cout << "virtual Base::f(int a)" << endl;     }     void f(double d) {         cout << "Base::f(double d)" << endl;      } }; class Derived : public Base { public:     void f(int a) {         cout << "virtual Derived::f(int a)" << endl;     } }; int main() {     Derived d;     d.f(3);     d.f(2.5);     Derived *pd = new Derived();     pd->f(3);     pd->f(2.5);     Base b;     b.f(5);     b.f(3.5);     Base *pBase = new Derived();     pBase->f(5);     pBase->f(3.5); } #include <iostream>using namespace std;class Base{public: virtual void f(int a) {  cout << "virtual Base::f(int a)" << endl; } void f(double d) {  cout << "Base::f(double d)" << endl; }};class Derived : public Base{public: void f(int a) {  cout << "virtual Derived::f(int a)" << endl; }};int main(){ Derived d; d.f(3); d.f(2.5); Derived *pd = new Derived(); pd->f(3); pd->f(2.5); Base b; b.f(5); b.f(3.5); Base *pBase = new Derived(); pBase->f(5); pBase->f(3.5);}

  子类Derived中的void f(int a)既覆盖了基类Base的虚函数virtual void f(int a),也隐藏了基类的virtual void f(int a),  void f(double d)函数。

  Derived d; d.f(3); d.f(2.5); Derived *pd = new Derived(); pd->f(3); pd->f(2.5); Derived d;d.f(3);d.f(2.5);Derived *pd = new Derived();pd->f(3);pd->f(2.5);

  同理所有用子类对象或者子类指针来调用f()函数时,都只执行virtual void f(int a),输出virtual Derived::f(int a)

  view plaincopyprint?Base *pBase = new Derived(); pBase->f(5); pBase->f(3.5); Base *pBase = new Derived();pBase->f(5);pBase->f(3.5);

  pBase->f(5),首先去Base类中寻找相应的函数,同理Base类中的两个函数virtual void f(int a)和void f(double d)是重载函数,因为实参为5,为int类型,所以我们要调用virtual void f(int a)虚函数,因为该函数是虚函数,所以要去判断pBase指向的具体对象,因为pBase指向的是一个子类的对象,所以需要去子类的虚函数表中取找virtual void f(int a)函数,找到之后,执行该函数,故输出virtual Derived::f(int a)。

  pBase->f(3.5),首先去Base类中寻找相应的函数,同理Base类中的两个函数virtual void f(int a)和void f(double d)是重载函数,因为实参为3.5,为double类型,所以我们要调用void f(double d),因为该函数为普通成员函数,故执行输出: void Base::f(double d);


C++ 开发语言,主导编程世界的地位

C语言属于高级语言,具有可移植性,面向过程的,贴近底层、运行速度快

       1、应用广泛

       C++ 语言广泛的用于基础软件、桌面系统、网络通信、音频视频、游戏娱乐等诸多领域,是世界上使用最广泛的编程语言之一

80%大型网络游戏由C++编程语言开发

80%大型网络游戏

由C++编程语言开发

大部分基础软件是由C++编程语言开发

大部分基础软件是由

C++编程语言开发

90%以上桌面系统都是由C++语言编写

90%以上桌面系统

都是由C++语言编写

C/C++ 技术在网络通信方面应用巨大

C/C++ 技术在网络通信

方面应用巨大


       2、稳居前列

       

稳居前列据世界权威语言排行榜(TIOBE)的最新数据显示(2019 年 3 月),C和C++ 语言已分别名列排行榜的第二和第四的位置。


C++ 软件人才稀缺,职业发展前景广

C++软件工程师在企业需求中呈上升趋势,人才需求发展处于坚挺状态


C++ 软件人才稀缺,职业发展前景广

可从事行业:算法实现 网络安全 物联网 图形 / 视频 / 多媒体处理 底层数据处理 区块链 负载均衡 反向代理


19年迭代,课程源自企业需求,紧跟时代

达内每一期课程大纲,由研发组结合热点技术与企业需求不断完善


第一阶段 C语言编辑基础课程内容:

• 计算机概述 • 标准 C 基础语法 • 数据结构和算法

学习目标

计算机概述,Linux Eclipse 开发环境搭建

基本数据类型,流程控制,数组 俄罗斯方块

各种存储结构优劣对比,排序算法优劣对比

第二阶段 linux c系统开发

课程内容

• Linux 文件系统 • Linux 内存管理 • Linux 进程管理

• Linux 线程管理 • 网络通讯开发

学习目标

掌握文件的打开与关闭、文件的读写、系统与标准I/O

掌握子进程创建、进程间通讯、信号捕获和处理

掌握线程创建、线程同步技术

第三阶段C++语言及数据库

课程内容

• C++ 基础 • OOP • 异常和 IO 流 • QT 开源框架库

• C++ 模板 • STL 标准模板库 • MySQL

学习目标

熟悉名字空间、各种数据类型的操作

熟练掌握C++ 各种异常情况处理,输入输出流操作

掌握QT 开源框架库的使用

了解C++ 泛化数据类型技术原理和实现

掌握STL 十大容器使用

第四阶段 windows系统开发

课程内容

• Windows 编程基础 • Windows 窗口 • Windows 线程管理 • MFC 框架总揽

• 视图架构 • MFC 序列化 • MFC 网络通讯 • ADO 接口

学习目标

掌握窗口的注册、窗口的创建、消息机制、资源的使用

了解MFC 的概述、程序启动机制、窗口创建机制

掌握文件操作、永久保存机制

掌握ADO 接口访问数据库技术

第五阶段 黑客攻防+网络安全

课程内容

• 网络安全概述 • 网络协议栈 • 密钥 • 内核加固

• 网络诱骗 • 防火墙 • 垃圾邮件过滤 • 恶意代码检测 • 嗅探器

学习目标

网络安全开发编码原理和切入点的剖析

对称秘钥、公钥秘钥的原理解析

针对木马攻击程序的反响渗透和注入技术

防火墙技术工作原理解析

各种抓包工具工作原理


多领域项目实战,助你职位发展先人一步

项目落地+重构,助你不仅能编程-更精编程



阶段项目一

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

HTTP服务器

WebServes

Web服务器可以解析客户端发来HTTP协议,根据用户请求,给予响应数据(静态网页,图片或动态页面)。

HTTP服务器

阶段项目二

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

网络爬虫

WebCrawler

搜索引擎的信息源自互联网,通过“网络爬虫”将整个“互联网”的海量信息获取到本地.(搜索引擎的入口)

阶段项目三

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

电信计费系统

DMS

电信部门针对电信用户登录信息进行采集,分析,传输,存储,以此作为对电信用户资费的依据。

阶段项目四

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

根据当天知识点,搭建或重构项目,深谙不同编程方式的区别,选择合适的实现方式。

远程监控

Remote Control

取消远程机所有的输入控制功能,实现本地机监视并控制远程机的所有输入输出操作。

扫描二维码免费领取试听课程

报名预约

登录51乐学网

注册51乐学网

免费短信关闭