C++之虚函数 Virtual Function

1. 普通虚函数(Virtual Function)

  • 定义:基类中用 virtual 声明,允许派生类 覆盖(Override)
  • 特点
    • 基类可提供默认实现。
    • 派生类可选择性覆盖(若不覆盖,则调用基类版本)。
  • 示例
    class Shape {
    public:virtual void draw() {cout << "Drawing a shape." << endl;}
    };
    

2. 纯虚函数(Pure Virtual Function)

  • 定义:基类中用 virtual 声明并以 = 0 结尾,强制派生类必须实现。

  • 特点:

    • 基类成为 抽象类(Abstract Class),无法实例化。
    • 用于定义接口规范,强制派生类遵守。
  • 示例

    class Shape {
    public:virtual void draw() = 0; // 纯虚函数
    };
    

3. 虚析构函数(Virtual Destructor)

  • 定义:基类的析构函数声明为 virtual,确保派生类对象通过基类指针删除时,能正确调用派生类的析构函数。
  • 场景:基类指针指向派生类对象时,必须使用虚析构函数以避免资源泄漏。
  • 现象:先执行派生类析构函数,再执行基类析构函数
#include <iostream>// 基类
class Base {
public:// 虚析构函数virtual ~Base() {std::cout << "Base class destructor" << std::endl;}
};// 派生类
class Derived : public Base {
public:~Derived() override {std::cout << "Derived class destructor" << std::endl;}
};int main() {// 通过基类指针创建派生类对象Base* basePtr = new Derived();// 删除基类指针delete basePtr;return 0;
}    

4. 关键词 (C++11)

一、override

显式标记派生类中对基类虚函数的重写,强制编译器检查函数签名是否完全匹配,避免因拼写错误或参数不匹配导致意外定义新函数

二、final

修饰类:禁止类被继承(如工具类或不可变类)。
修饰虚函数:禁止派生类进一步重写该函数(如关键算法或接口)。

class Base {
public:virtual void log() final { // 禁止派生类覆盖cout << "Base log." << endl;}
};
#include <iostream>// 基类
class Base {
public:// 虚函数virtual void print() {std::cout << "This is the Base class." << std::endl;}
};// 派生类
class Derived : public Base {
public:// 重写基类的虚函数void print()final {std::cout << "This is the Derived class." << std::endl;}
};// 派生类的派生类
/*
class Deriveder : public Derived {
public:// 重写基类的虚函数void print() override {std::cout << "This is the Deriveder class." << std::endl;}
};
*/// 多态函数
void callPrint(Base* obj) {obj->print();
}int main() {Base base;Derived derived;//Deriveder Deriveder;// 调用多态函数callPrint(&base);callPrint(&derived);//callPrint(&Deriveder);return 0;
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于尚硅谷FreeRTOS视频笔记——15—系统配制文件说明与数据规范

目录 配置函数 INCLUDE函数 config函数 数据类型 命名规范 函数与宏 配置函数 官网上可以查找 最核心的就是 config和INCLUDE INCLUDE函数 这些就是裁剪的函数 它们使用一个ifndef。如果定义了&#xff0c;就如果定义了这个宏定义&#xff0c;那么代码就生效。 通过ifn…

HAL库配置RS485+DMA+空闲中断收发数据

前言&#xff1a; &#xff08;1&#xff09;DMA是单片机集成在芯片内部的一个数据搬运工&#xff0c;它可以代替单片机对数据进行传输、存储&#xff0c;节约CPU资源。一般应用场景&#xff0c;ADC多通道采集&#xff0c;串口收发&#xff08;频繁进入接收中断&#xff09;&a…

从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅

大家好呀&#xff01;今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼&#xff0c;别担心&#xff01;我会用最通俗易懂的方式&#xff0c;带你从main()方法开始&#xff0c;一步步揭开Spring Boot的…

下载HBuilder X,使用uniapp编写微信小程序

到官网下载HBuilder X 地址&#xff1a;HBuilderX-高效极客技巧 下载完成后解压 打开解压后的文件夹找到HBuilderX.exe 打开显示更多&#xff0c;发送到桌面快捷方式 到桌面上启动HBuilderX.exe启动应用 在工具点击插件安装 选择安装Vue3编译器 点击新建创建Vue3项目 编写项目…

详解与HTTP服务器相关操作

HTTP 服务器是一种遵循超文本传输协议&#xff08;HTTP&#xff09;的服务器&#xff0c;用于在网络上传输和处理网页及其他相关资源。以下是关于它的详细介绍&#xff1a; 工作原理 HTTP 服务器监听指定端口&#xff08;通常是 80 端口用于 HTTP&#xff0c;443 端口用于 HT…

2. ubuntu20.04 和VS Code实现 ros的输出 (C++,Python)

本节对应赵虚左ROS书籍的1.4.2 1)创建工作空间 mkdir -p catkin_ws/src cd catkin_ws catkin_make 2) 终端进入VS Code code . 3) vscoe 的基本配置 3.1&#xff09;修改.vscode/tasks.json ,修改内容如下&#xff1a; { // 有关 tasks.json 格式的文档&#xff0c;请参见…

SAP系统中MD01与MD02区别

知识点普及&#xff0d;MD01与MD02区别 1、从日常业务中&#xff0c;我们都容易知道MD01是运行全部物料&#xff0c;MD02是运行单个物料 2、在做配置测试中&#xff0c;也出现过MD02可以跑出物料&#xff0c;但是MD01跑不出的情况。 3、MD01与MD02的差异: 3.1、只要在物料主数…

快速迭代收缩-阈值算法(FISTA)

文章目录 1. 数学与优化基础2. FISTA 算法的原理、推导与机制3. Matlab 实现4. FISTA 在图像处理与压缩感知中的应用4.1. 基于小波稀疏先验的图像去噪4.2 压缩感知图像重建 1. 数学与优化基础 在许多信号处理与机器学习问题中&#xff0c;我们希望获得稀疏解&#xff0c;即解向…

微服务之间打通用户上下文

微服务之间打通用户上下文 打通上下文步骤需求&#xff1a;1、gateway网关登录拦截器&#xff1a;【LoginFilter】解释&#xff1a;代码 2、SpringMVC全局处理&#xff1a;【GlobalConfig】解释&#xff1a;代码&#xff1a; 3、自定义登录拦截器&#xff1a;【LoginIntercepto…

Hutool之DateUtil:让Java日期处理变得更加简单

前言 在Java开发中&#xff0c;日期和时间的处理是一个常见问题。为了简化这个过程&#xff0c;许多开发者会使用第三方工具包&#xff0c;如Hutool。Hutool是一个Java工具包&#xff0c;提供了许多实用的功能&#xff0c;其中之一就是日期处理。日期时间工具类是Hutool的核心包…

ES中常用的Query和查询作用,以及SpringBoot使用实例

ES中常用的Query和查询作用&#xff0c;以及 SpringBoot 使用实例 文章目录 ES中常用的Query和查询作用&#xff0c;以及 SpringBoot 使用实例MatchAllQueryTermQueryBoolQueryRangeQueryMatchQueryMultiMatchQueryTermsQueryPrefixQueryWildcardQueryRegexpQueryFuzzyQueryDis…

Flutter 自定义插件基础

1、Flutter插件是什么&#xff1f;官方插件库 在开发Flutter应用过程中会涉及到平台相关接口调用&#xff0c;例如数据库操作、相机调用、外部浏览器跳转等业务场景。其实Flutter自身并不支持直接在平台上实现这些功能&#xff0c;而是通过插件包接口去调用指定平台API从而实现…

极狐GitLab 外部授权控制机制是怎样的?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 外部授权控制 (BASIC SELF) 在高度控制的环境中&#xff0c;访问策略可能需要由外部服务控制&#xff0c;该服务允许基于项目…

Linux系统之----冯诺依曼结构

1.简要描述 冯诺依曼体系结构是现代计算机的基本设计思想&#xff0c;其核心理念是将计算机的硬件和软件统一为一个整体&#xff0c;通过存储程序的方式实现计算。冯诺依曼体系结构的核心思想是通过存储程序实现自动计算&#xff0c;其五大部件协同工作&#xff0c;奠定了现代…

【八股】计算机网络

1 概述 1.1 网络的网络 网络把主机连接起来,而互连网(internet)是把多种不同的网络连接起来,因此互连网是网络的网络。而互联网(Internet)是全球范围的互连网。 1.2 ISP 互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址,同时拥有通信线路以及路由器等联…

基于VS Code 为核心平台的python语言智能体开发平台搭建

以下是基于 VS Code 为核心平台&#xff0c;整合 Node-RED、Gradio、Docker Desktop 的智能体可视化开发平台优化方案&#xff0c;聚焦工具链深度集成与开发效率提升&#xff1a; 一、核心架构设计 #mermaid-svg-f8l9kYPAlJ2TlpGF {font-family:"trebuchet ms",verd…

STM32G0单片机自带RTC

STM32有个自带RTC外设&#xff0c;外接32.768KHz的晶振后可得到相对精确的计时功能。 实测了一个一小时快个1秒多。 1 cubeMX设置了RTC后自动生成的初始化代码如下 static void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeT…

细说STM32单片机FreeRTOS任务管理API函数及多任务编程的实现方法

目录 一、FreeRTOS任务管理API函数 1、任务管理API函数 2、获取任务的句柄 &#xff08;1&#xff09;函数xTaskGetCurrentTaskHandle() &#xff08;2&#xff09;函数xTaskGetIdleTaskHandle() &#xff08;3&#xff09;函数xTaskGetHandle() 3、单个任务的操作 &a…

星露谷物语 7000+ 大型MOD整合包

衣服美化、家具美化、地图美化、人物肖像美化 全地图装修存档、人物美化、扩展包、环境美化、家具、动植物、通用前置包、新增NPC、功能、服装发饰妆 帽子发型农场小镇美化大型玩法拓展实用功能mod 动漫人物形象MOD 地点/动物/地图/功能/机械/家具/建筑/界面美化/扩展/农场/食谱…

C++ `unique_ptr` 多线程使用

C unique_ptr 多线程使用 一、核心结论 操作同一个 unique_ptr&#xff1a;必须加锁&#xff08;所有权转移是非原子操作&#xff09;访问被管理对象&#xff1a;若对象非线程安全&#xff0c;仍需额外同步独立 unique_ptr 实例&#xff1a;不同线程操作不同实例时无需加锁 二…