- 浏览: 373376 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
五 虚函数
VC++中的虚函数主要用来实现程序运行的多态性。所谓多态性是指发出同样的消息(如函数的调用)被不同类型的对象接受时导致不同的行为。利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接受消息的对象。对象根据所接受到的消息而做出相应的操作。
多态性是面向对象程序设计的重要特征之一。它与前面讲过的封装性和继承性构成了面向对象程序设计的三大特征。这三大特性是相互关联的。封装性是基础,继承性是关键,多态性是补充。
VC++中的多态可以分为两种,一种是编译时的多态性,一种是运行时的多态性。编译时的多态性主要是通过函数的重载和运算符的重载来实现,它在程序运行之前(编译时)就能够确定其实现的方法。运行时的多态性则要等到程序运行时才能确定程序的具体执行情况,它主要通过虚函数来实现。
虚函数的定义及使用
如果将函数定义为虚函数,则表示函数的具体实现是不确定的,相同的调用形式要根据运行时不同的对象来确定其实现方式。它与函数的重载不同,函数的重载根据其调用形式(函数的参数)就能够确定其实现方式。
在类中,如果在某一函数的前面加上关键字”virtual”,则表示将该函数说明为虚函数。虚函数一定是类的成员函数,其多态性要通过类的继承关系来实现。如果将类中的函数说明为虚函数,则该类的派生类中相同原型的函数(同名,且参数类型,顺序以及个数都相同)均具有虚特性而不管是否有关键子”virtual”修饰。例如:
程序运行结果:
类A中的函数
类B中的函数
程序基类中A行将函数fun()说明为虚函数,则在类A的派生类B中函数fun()虽然没有用”virtual”修饰,它也为虚函数,在主函数中的B行和C行虽然调用形式相同,但两次调用时指针p所指向的对象不同,因而调用的是不同对象的成员函数,所以其输出也不同。
在说明和使用虚函数时,应该注意以下几点:
(1) 虚函数同于不同的有继承关系的类中的相同原型函数(同名,且参数类型,顺序以及个数都相同),仅函数名相同则属于函数的重载;单独的一个虚函数没有实际的意义。
(2) 虚函数的多态性必须通过相同的指针来实现,通过对象名来调用虚函数不能体现虚函数的多态性。一般来说,实现虚函数的多态性是通过基类的指针指向不同的对象来处理虚函数的。
(3) 虚函数是类的成员函数,但不能是静态成员函数,更不能是友元函数。友元函数不是类的成员。
(4) 如果派生类中没有重新定义虚函数,则不能体现虚函数的多态性。
纯虚函数
如果基类中的某个函数的功能暂时还不能确定或没有必要先确定,则可以先不具体定义此函数而先将其说明为纯虚函数,其具体实现在派生类中定义。纯虚函数的定义方式是将一个明确了函数原型的虚函数赋以初值0。例如:
程序在基类A中将函数void fun(int)定义为纯虚函数(A行)。由于基类A含有纯虚函数,纯虚函数没有具体的实现,所以不能利用它来生成对象,但可以定义一个指向该类的指针,如程序中的C行。
定义一个纯虚函数,本质上是将一个空指针值0赋给函数名,但该函数的原型必须确定,纯虚函数不同于空函数,空函数有一个空的函数体,虽然它什么都不做,但是它是一个完整的函数,可以调用它。
程序中派生类B的成员void fun(int)是类A中纯虚函数的实现,它的函数原型必须与上述纯虚函数相同。
主函数中定义了一个指向基类的指针,然后根据赋值兼容性规则将其指向派生类的对象,在通过它调用了B类中的函数fun,这是运行是的多态性。虽然p指向了派生类的对象,但其形式上还是指向类A的,所以在类A中如果没有相应函数的说明,则程序中D行编译时会出错,只有在运行时才能确定其指向的是对象b1。所以A中的函数fun从语法上将是必须的,但从功能上将又不是必不可少的,没有必要定义其函数的实现,因而将其定义为串虚函数。
(一)
运行结果: 5 5 5 6
(二)
运行结果: 5 6 5 6
VC++中的虚函数主要用来实现程序运行的多态性。所谓多态性是指发出同样的消息(如函数的调用)被不同类型的对象接受时导致不同的行为。利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接受消息的对象。对象根据所接受到的消息而做出相应的操作。
多态性是面向对象程序设计的重要特征之一。它与前面讲过的封装性和继承性构成了面向对象程序设计的三大特征。这三大特性是相互关联的。封装性是基础,继承性是关键,多态性是补充。
VC++中的多态可以分为两种,一种是编译时的多态性,一种是运行时的多态性。编译时的多态性主要是通过函数的重载和运算符的重载来实现,它在程序运行之前(编译时)就能够确定其实现的方法。运行时的多态性则要等到程序运行时才能确定程序的具体执行情况,它主要通过虚函数来实现。
虚函数的定义及使用
如果将函数定义为虚函数,则表示函数的具体实现是不确定的,相同的调用形式要根据运行时不同的对象来确定其实现方式。它与函数的重载不同,函数的重载根据其调用形式(函数的参数)就能够确定其实现方式。
在类中,如果在某一函数的前面加上关键字”virtual”,则表示将该函数说明为虚函数。虚函数一定是类的成员函数,其多态性要通过类的继承关系来实现。如果将类中的函数说明为虚函数,则该类的派生类中相同原型的函数(同名,且参数类型,顺序以及个数都相同)均具有虚特性而不管是否有关键子”virtual”修饰。例如:
#include<iostream.h> class A{ public: virtual void fun() //A行 {cout<<"类A中的函数\n";} }; class B:public A{ public: void fun() {cout<<"类B中的函数\n";} }; void main() { A a1,*p; B b1; p=&a1; p->fun(); //B行 p=&b1; p->fun(); //C行 }
程序运行结果:
类A中的函数
类B中的函数
程序基类中A行将函数fun()说明为虚函数,则在类A的派生类B中函数fun()虽然没有用”virtual”修饰,它也为虚函数,在主函数中的B行和C行虽然调用形式相同,但两次调用时指针p所指向的对象不同,因而调用的是不同对象的成员函数,所以其输出也不同。
在说明和使用虚函数时,应该注意以下几点:
(1) 虚函数同于不同的有继承关系的类中的相同原型函数(同名,且参数类型,顺序以及个数都相同),仅函数名相同则属于函数的重载;单独的一个虚函数没有实际的意义。
(2) 虚函数的多态性必须通过相同的指针来实现,通过对象名来调用虚函数不能体现虚函数的多态性。一般来说,实现虚函数的多态性是通过基类的指针指向不同的对象来处理虚函数的。
(3) 虚函数是类的成员函数,但不能是静态成员函数,更不能是友元函数。友元函数不是类的成员。
(4) 如果派生类中没有重新定义虚函数,则不能体现虚函数的多态性。
纯虚函数
如果基类中的某个函数的功能暂时还不能确定或没有必要先确定,则可以先不具体定义此函数而先将其说明为纯虚函数,其具体实现在派生类中定义。纯虚函数的定义方式是将一个明确了函数原型的虚函数赋以初值0。例如:
#include<iostream.h> class A{ protected: int a; public: A(int x){a=x;} virtual void fun(int)=0; //A行 }; class B:public A{ int b; public: B(int x,int y):A(y){b=x;} void fun(int x) //B行 { cout<<a+x<<'\n'; cout<<b+x<<'\n'; } }; void main() { A *p; //C行 B b1(2,6); p=&b1; p->fun(1); //D行 }
程序在基类A中将函数void fun(int)定义为纯虚函数(A行)。由于基类A含有纯虚函数,纯虚函数没有具体的实现,所以不能利用它来生成对象,但可以定义一个指向该类的指针,如程序中的C行。
定义一个纯虚函数,本质上是将一个空指针值0赋给函数名,但该函数的原型必须确定,纯虚函数不同于空函数,空函数有一个空的函数体,虽然它什么都不做,但是它是一个完整的函数,可以调用它。
程序中派生类B的成员void fun(int)是类A中纯虚函数的实现,它的函数原型必须与上述纯虚函数相同。
主函数中定义了一个指向基类的指针,然后根据赋值兼容性规则将其指向派生类的对象,在通过它调用了B类中的函数fun,这是运行是的多态性。虽然p指向了派生类的对象,但其形式上还是指向类A的,所以在类A中如果没有相应函数的说明,则程序中D行编译时会出错,只有在运行时才能确定其指向的是对象b1。所以A中的函数fun从语法上将是必须的,但从功能上将又不是必不可少的,没有必要定义其函数的实现,因而将其定义为串虚函数。
(一)
#include<iostream.h> class A{ int a,b; public: int sum(int x,int y) {return (x+y);} }; class B:public A{ public: int sum(int x,int y) {return (x*y);} }; void main() { A a1,*p; B b1; p=&a1; cout<<p->sum(3,2)<<'\n'; p=&b1; cout<<p->sum(3,2)<<'\n'; cout<<a1.sum(3,2)<<'\n'; cout<<b1.sum(3,2)<<'\n'; }
运行结果: 5 5 5 6
(二)
#include<iostream.h> class A{ int a,b; public: virtual int sum(int x,int y) {return (x+y);} }; class B:public A{ public: int sum(int x,int y) {return (x*y);} }; void main() { A a1,*p; B b1; p=&a1; cout<<p->sum(3,2)<<'\n'; p=&b1; cout<<p->sum(3,2)<<'\n'; cout<<a1.sum(3,2)<<'\n'; cout<<b1.sum(3,2)<<'\n'; }
运行结果: 5 6 5 6
发表评论
-
FreeRTOS
2022-03-05 16:31 253Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 417https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1346https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 481https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 580// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 593https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5828583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 609参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2176基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9161 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1596OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1886ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 878转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1926转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1095C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 974转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1006转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 821参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1623转自 http://blog.csdn.net/weixinh ...
相关推荐
### C++多态性与虚函数知识点解析 #### 一、多态性的概念 多态性是面向对象编程的一个核心特性,它允许我们通过基类的接口来操作派生类的对象。这种特性使得代码更加灵活且易于扩展。在C++中,多态性主要通过虚函数...
在C++中,虚函数允许子类重写父类的功能,这是实现多态性(Polymorphism)的基础。当一个基类指针或引用指向派生类的对象时,通过调用虚函数,可以执行派生类中的版本,而不是基类的版本。这种机制使得代码更加灵活...
这些知识有助于开发者更深入地理解C++多态性的底层实现机制,并为进一步探索如多继承下的虚函数调用、动态链接库(DLL)实现机制等更复杂的问题打下了坚实的基础。 通过学习和掌握反汇编技术,不仅可以帮助我们更好地...
在C++编程语言中,多态性和虚函数是面向对象编程的重要特性,它们允许程序员创建灵活且可扩展的代码结构。本次实验旨在深入理解和熟练运用这两个概念。实验报告的标题和描述表明,这是一个关于C++实验,特别是针对多...
本压缩包包含了几个关键的学习资源,旨在帮助开发者深入理解和应用C++,尤其是虚函数表的原理以及Win32 API中的多线程编程。 首先,C++习题集是学习任何编程语言的基础。通过实践和解决问题,可以巩固理论知识,...
【C++基础知识题】 C++是一种强类型、面向对象的编程语言,对于初学者和专业开发者来说,掌握C++的基础知识至关重要。以下是一些从题目中提取的关键知识点: 1. **变量声明**:在C++中,变量声明的语法应当正确。...
C++虚函数、this指针相关知识 C++作为一门面向对象的语言,具有封装、继承、多态三大特性。其中虚函数和this指针是C++中两个非常重要的概念。 谈面向对象(Object-oriented) 面向对象是一种编程方式,它将现实...
C++是一种强大的、通用的编程语言,由Bjarne Stroustrup在1979年设计并开发,...这份"编程语言C++基础知识课件"将引导你逐步掌握这个强大语言的关键概念,无论你是初学者还是有一定经验的开发者,都将从中受益匪浅。
这份"C++基础知识讲义v2"是一份专为初学者和初级C++讲师设计的学习资料,涵盖了C++的基础概念和关键特性。 1. **编程入门**(c++基礎知識1編程入門.pps):这部分通常会介绍C++的历史、基本语法,如变量声明、数据...
在C++编程语言中,虚函数(Virtual Functions)是一个核心特性,它允许我们实现多态性,这是面向对象编程中的重要概念。虚函数使得基类的指针或引用可以调用派生类重写后的成员函数,从而实现动态绑定。在“CPP.rar...
4. **虚函数**:虚函数是C++实现多态性的重要机制。在基类中声明为虚函数的函数,可以在派生类中重写,这样在基类指针或引用指向派生类对象时,能够调用到正确的派生类版本的函数,实现动态绑定。 5. **公约数**:...
《C++程序设计基础》课程中的“虚函数与多态性”是面向对象编程的核心概念之一,主要讨论了如何在C++中实现不同类型的对象共享相同接口的能力,即多态性。多态性使得程序更加灵活,代码复用性更强。在C++中,多态性...
【C++基础知识】 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、应用软件、游戏开发等领域。它的基础知识包括: 1. **语法基础**:C++沿袭了C语言的基本语法,如变量声明、数据类型(int、char、...
包括类、继承与派生、多态性与虚函数等。如果你原就有一定的C语言基础,这份文档会让你学起C++来事半功倍,当然没有C语言基础的也可学习,因为文档里不仅仅写了二者的区别,也对C++里的函数等做了一个详细的阐述!
- **虚函数和多态性**:虚函数实现动态绑定,支持多态,使得基类指针或引用可以调用派生类的重写函数。 - **C++流**:I/O流模型简化了输入输出操作,如`cin`和`cout`。 - **异常处理**:用try/catch块捕获和处理...
8. **继承与多态**:介绍类之间的继承关系,单继承和多继承的概念,以及虚函数和多态性,包括动态绑定和纯虚函数。 9. **模板**:讲解函数模板和类模板,以及模板的特化和偏特化。 10. **异常处理**:学习C++的...
这个名为"C++基础知识代码示例"的压缩包文件很可能是为了帮助初学者或开发者巩固和理解C++的基础概念和编程技巧。 首先,C++的基础知识包括以下几个核心部分: 1. **基本语法**:C++的语法与C语言非常相似,包括...
学习C++的基础知识,对于任何想要从事软件开发的人来说都是必要的。它不仅适用于系统级编程,也是游戏开发、嵌入式系统、桌面应用和大规模软件项目的重要选择。掌握C++的基础,不仅可以帮助理解其他高级编程语言,也...
### C++基础知识 1. **面向对象编程**:C++引入了类(class)的概念,实现了封装、继承和多态,是面向对象编程的重要特征。类是创建对象的蓝图,对象则是类的实例。 2. **构造函数与析构函数**:构造函数在对象...