首页 > 其他分享 >什么是虚函数和纯虚函数?以及区别

什么是虚函数和纯虚函数?以及区别

时间:2024-10-23 14:47:32浏览次数:11  
标签:定义 区别 实现 子类 纯虚 派生类 函数

什么是虚函数和纯虚函数?以及区别?

虚函数:

定义:被virtual关键字修饰的成员函数。在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。其用法格式为:virtual 函数返回类型 函数名(参数表){函数体}。
特性:虚函数实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
实现:虚函数既有定义,也有实现的代码。
类对象:包含虚函数的类可以定义其对象。

纯虚函数:

  1. 定义:在函数句首使用virtual关键字修饰,并且在句末增加“= 0”的函数。如virtual void funtion() = 0。
  2. 特性:纯虚函数是特殊的虚函数,它只有函数名、参数、返回值类型,没有函数体。它要求每个派生类都必须提供具体的实现。
  3. 实现:纯虚函数只有声明,没有实现。但需要注意的是,基类可以存在纯虚函数的实现(但无意义,因为子类都要重写)。
  4. 抽象类:包含纯虚函数的类被称为“抽象类”。抽象类不能实例化,即不能使用new操作符创建对象。只有实现了所有纯虚函数的子类才能实例化。
  5. 目的:定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。

虚函数与纯虚函数的区别

  1. 定义与实现:虚函数既有定义也有实现,而纯虚函数只有定义(声明)没有实现。
  2. 类实例化:包含虚函数的类可以实例化,而包含纯虚函数的类(抽象类)不能实例化。
  3. 子类要求:虚函数在子类中可以被覆盖,也可以不被覆盖;而纯虚函数必须在子类中实现,否则编译器将报错。
  4. 用途:虚函数主要用于实现多态性,允许根据对象的实际类型调用适当的函数;而纯虚函数主要用于定义抽象接口,子类通过实现纯虚函数来提供具体的功能实现。
    综上所述,虚函数和纯虚函数在C++中各有其独特的用途和特性。虚函数是实现多态性的关键,而纯虚函数则是定义抽象类和接口继承的基础。

标签:定义,区别,实现,子类,纯虚,派生类,函数
From: https://blog.csdn.net/qq_38556796/article/details/143183838

相关文章

  • Java中super和this的用法和区别
    一、this是自身的一个对象,代表对象本身,可以理解为指向对象本身的一个指针this是用来访问本类实例属性和方法的,它会先从本类中找,如果本类中找不到则在父类中找this属性使用:用来赋值本类属性(最常见的用法),写类时的setter方法eg:publicvoidsetId(intid){this.id=i......
  • ShaderType与Queue区别
    RenderType与Queue的区别指定RenderType的名称,主要是为了替换渲染方式;而Queue是设定渲染顺序。RenderTypeRenderType通常使用的值包括:Opaque:用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。Transparent:用于半透明着色器(透明着色器、粒子着色......
  • IDE和IDEA的定义和区别
    IDE(集成开发环境)定义:IDE是集成开发环境的缩写,是一种用于提供程序开发环境的应用程序。它集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。特点:IDE旨在提高开发人员的生产力,简化开发过程,并......
  • miniqmt 函数分享-2. 执行过程跟踪和记录
    2.执行过程跟踪和记录函数介绍:Python日志配置和追踪模块,名为logger.py。它使用loguru库来实现日志记录,并提供了一个上下文管理器TraceContext用于追踪函数的执行。主要部分:TraceContext类:功能:用于追踪函数执行的上下文信息。generate_trace_id方法:......
  • 【python学习记录篇】09.Python函数进阶,上难度了上难度了
    小白学习纪实,跨专业学python的第九天~没想到python也要学函数......真是干的漂亮......    9.1函数    9.1.1函数的意义    在生活中,试想一下我们用手洗衣服的时候,我们需要接水,放入脏衣服,放入洗衣液,然后一件件用手搓,每次洗衣服的时候都要这样干,很......
  • Cmake中“目标层级“的概念(target_include_directories和include_directories的区别)
    CMake中,“目标层级”(Target-Level)是一个核心概念,涉及到项目中构建的具体实体,如可执行文件、库等。理解目标层级对于有效地使用现代CMake功能、管理依赖关系以及配置构建过程至关重要。以下将详细解释什么是目标层级、其重要性以及如何在CMake中应用相关命令。什么是“......
  • Vue 2 和 Vue 3 区别(解析组合式与选项式)
    Vue2和Vue3在组件的组织方式上有一些重要的区别,主要体现在选项式API(OptionsAPI)和组合式API(CompositionAPI)上。下面我将详细介绍这两种API的区别,并提供相应的代码示例。选项式API(OptionsAPI)选项式API是Vue2中最常用的API风格,它通过选项来组织组件的逻......
  • Lambda 架构 vs Kappa 架构区别
    酒店lambda架构、kappa架构  Lambda架构面临的挑战是,您需要为实时层和批处理层复制预处理和其他常见工作,因此建议对这两种提取使用相同的服务,例如Spark,它有助于完成这两种操作。Kappa架构的引入是为了采用统一的方法来应对这一挑战,并且只有一个流层,使用ApacheKa......
  • 【上传一张照片,定制程序员科技感写真】函数计算一键部署 PuLID for FLUX大模型
    在这个属于代码世界的节日里,我们为你准备了一份特别的礼物,不论你是前端大牛,还是后端高手;无论是数据分析师,还是算法工程师,只需一张图片,创下你与代码共舞的瞬间,一键生成专属于你的超写实程序员写真!10月21日—11月29日,三步轻松完成体验,即可获得精美电脑包,(活动期间每个工作日限量30个......
  • DAPLINK 源码学习(1)BL 之 main() 函数
    目录bootloader主函数1sdk_init()2gpio_init()3config_init()4board_bootloader_init()5运行IF还是BL?6main_task()7总结bootloader主函数1)我们以stm32f103xb_bl为例,从bootloader项目的main()函数开始:(1)sdk_init():MCU初始化(2)gpio_init():USB相关引脚配......