随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

C++之虚函数

虚函数的实质和用途:如果不定义虚函数,基类和扩展类中不能有同名函数(名字,参数个数顺序类型都相同),否则会发生同名覆盖,此时想用基类指针去调用扩展类的对象是行不通的;但如果将基类的成员函数定时成虚函数,相当于允许扩展类中重新定义该同名函数执行不同的功能,此时就可以用基类的指针去指向扩展类,从而调用扩展类的成员函数,从而实现与用基类指针指向基类、调用基类同名函数不同的功能即实现了多态。

一个函数是否定义成虚函数的依据:1 虚函数所在的类有可能被派生类继承 2函数的功能在派生类中有可能改写3 通过基类指针调用派生类的对象。

系统只所以能区分基类指针调用的成员函数是基类的还是扩展类的,是因为在运行中根据基类指针指向的对象不同来识别的,内部会增加一个指针数组形式的指针数组(指向同名虚函数的入口地址),增加了一部分的开销。纯虚函数在基类中没有定义实体,只是建立一个框架,等待扩展类来实现。

虚析构函数:

  如果用基类指针指向一个new 扩展类,在delet 基类指针时只会调用基类的析构函数而不会调用扩展类的析构,所以常将基类的析构函数定义成虚函数即虚析构函数,这样delete时才能正确的先调用扩展类的析构再调用基类的析构函数。

纯虚函数:

  1 定义:在声明虚函数时初始化为0的函数。形式vitual 函数名()=0;

        2 =0不是说返回值为0而是告诉系统这是一个纯虚函数。

        3纯虚函数没有函数体不能被调用,只能被扩展类改写

        4除非扩展类中再次将基类的纯虚函数定义成纯虚函数,否则纯虚函数在扩展类中将不在纯虚即可以用来定义实体对象了

抽象类的特点:

      1包含纯虚函数的类被称为抽象类,抽象类不是对基础对象的抽象,所以不能定义实体,

       2 抽象类一般位于系统的顶层。抽象类是本类族的公共接口包含了共同属性,但通过基类指针调用时又呈现不同的多态。

       3

 

posted on   杰瑞鼠  阅读(253)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2016-12-16 关于串口的字符串输出和二进制数据流输出
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示