C++中的虚函数与纯虚函数

文章目录

    • 虚函数 (Virtual Function)
    • 纯虚函数 (Pure Virtual Function)
    • 主要区别
    • 实际应用示例

C++中的虚函数和纯虚函数是实现多态性的重要机制。

虚函数 (Virtual Function)

虚函数是在基类中用virtual关键字声明的函数,它允许派生类重写(override)该函数的实现。当通过基类指针或引用调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数,这就是动态绑定或运行时多态。

class Base {
public:virtual void show() {cout << "Base class show function" << endl;}virtual ~Base() {}  // 虚析构函数
};class Derived : public Base {
public:void show() override {cout << "Derived class show function" << endl;}
};

纯虚函数 (Pure Virtual Function)

纯虚函数是在虚函数声明后面加上= 0的函数,它没有实现。包含纯虚函数的类被称为抽象类,不能被实例化。派生类必须实现所有纯虚函数才能被实例化。

class AbstractBase {
public:virtual void pureVirtualFunction() = 0;  // 纯虚函数virtual void normalVirtualFunction() {   // 普通虚函数cout << "Normal virtual function" << endl;}virtual ~AbstractBase() {}
};

主要区别

实现方面:虚函数有默认实现,纯虚函数没有实现

类的实例化:包含纯虚函数的类是抽象类,不能实例化;只包含虚函数的类可以实例化

派生类要求:派生类可以选择是否重写虚函数,但必须实现所有继承的纯虚函数

设计意图:虚函数提供默认行为但允许定制,纯虚函数强制派生类提供具体实现

实际应用示例

#include <iostream>
#include <vector>
#include <memory>
using namespace std;// 抽象基类
class Animal {
public:virtual void makeSound() = 0;  // 纯虚函数virtual void sleep() {         // 虚函数cout << "Animal is sleeping" << endl;}virtual ~Animal() {}
};class Dog : public Animal {
public:void makeSound() override {cout << "Woof!" << endl;}
};class Cat : public Animal {
public:void makeSound() override {cout << "Meow!" << endl;}void sleep() override {cout << "Cat is sleeping on the sofa" << endl;}
};int main() {vector<unique_ptr<Animal>> animals;animals.push_back(make_unique<Dog>());animals.push_back(make_unique<Cat>());for (auto& animal : animals) {animal->makeSound();  // 多态调用animal->sleep();      // 多态调用}return 0;
}

这种设计模式在实际开发中非常有用,比如图形界面框架中的控件基类、游戏引擎中的实体类、以及各种设计模式的实现中都会大量使用虚函数和纯虚函数来实现灵活的多态架构。

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

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

相关文章

(LeetCode 每日一题) 3330. 找到初始输入字符串 I (字符串)

题目&#xff1a;3330. 找到初始输入字符串 I 思路&#xff1a;字符串&#xff0c;时间复杂度0(n)。 默认没有输错的情况ans1&#xff0c;而输错的情况&#xff0c;只会出现在连续相等字符串&#xff0c;假设这段字符串长度为ct&#xff0c;那么可能的情况为ct-1。累计这些和到…

Deep semi-supervised learning for medical image segmentation: A review

概述 医学图像分割的重要性&#xff1a;它是计算机辅助诊断&#xff08;CAD&#xff09;的关键部分&#xff0c;能帮助医生定位病变、评估治疗效果&#xff0c;减轻医生工作量。 深度学习技术的应用&#xff1a;U-Net等网络在医学图像分割中表现优异&#xff0c;近期大型视觉语…

[云上玩转Qwen3系列之四]PAI-LangStudio x AI搜索开放平台 x ElasticSearch: 构建AI Search RAG全栈应用

本文详细介绍了如何使用 PAI-LangStudio 和 Qwen3 构建基于AI搜索开放平台 x ElasticSearch 的 AI Search RAG 智能检索应用。该应用通过使用 AI 搜索开放平台、ElasticSearch 全文检索向量检索引擎的混合检索技术配合阿里云最新发布的 Qwen3 推理模型编排在一个 Agentic Workf…

前端请求浏览器提示net::ERR_UNSAFE_PORT的解决方案

起因 项目中后端给到了6666端口的服务地址, 随即前端项目访问中浏览器报错如下: 不安全端口在主流浏览器&#xff08;Chrome/Firefox/Edge/Safari&#xff09;中会被拦截&#xff0c;触发浏览器Network的status列显示 net::ERR_UNSAFE_PORT 错误, 以下是常见的不安全端口一览…

【Bluedroid】蓝牙设备管理器初始化全流程深度解析(BTA_dm_on_hw_on)

本文全面剖析Android蓝牙设备管理器在硬件启动时的初始化流程&#xff0c;涵盖控制块创建、服务发现启动、设备类配置、安全密钥加载、超时参数设置等核心环节。通过分析从底层硬件交互到上层服务注册的全链路调用&#xff0c;揭示蓝牙系统从硬件就绪到功能可用的完整启动机制&…

大语言模型:是逐字生成还是一次多词?

大语言模型(LLM)既可以按顺序逐个生成单词(token),也能实现一次生成多个 token 核心差异源于解码策略与模型架构设计 一、常规“逐个生成”模式(基础逻辑) 多数入门级演示或简单文本生成中,LLM 会默认按 “生成一个 token → 拼接回输入 → 再生成下一个” 的流程,…

通俗易懂的LangGraph图定义解析

LangGraph 是一个基于状态的工作流框架&#xff0c;它通过 节点&#xff08;Nodes&#xff09; 和 边&#xff08;Edges&#xff09; 的组合&#xff0c;构建出复杂的工作流逻辑。这种设计特别适合处理需要动态决策、循环、多步骤交互的场景&#xff08;比如对话系统、智能代理…

K8s Pod调度基础——2

目录 一、Deployment ‌一、Deployment 原理‌ ‌二、核心特性‌ ‌三、意义与场景‌ ‌四、示例与逐行解释‌ ‌五、总结‌ StatefulSet ‌一、StatefulSet 原理‌ ‌二、核心特性‌ ‌三、意义与场景‌ ‌四、示例与逐行解释‌ ‌五、总结‌ 彼此的区别 一、本质…

Java 大视界 -- Java 大数据在智能医疗健康管理中的慢性病风险预测与个性化干预(330)

Java 大视界 -- Java 大数据在智能医疗健康管理中的慢性病风险预测与个性化干预&#xff08;330&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 构建的医疗数据融合平台&#xff08;多源数据安全打通&#xff09;1.1 分布式医疗数据集成系统&#xff08;符合 HIPAA 与…

beego打包发布到Centos系统及国产麒麟系统完整教程

1、先清除go缓存&#xff0c;用下面命令 go clean -cache go clean -modcache 2、更新库文件 go mod tidy 3、安装beego go install github.com/beego/bee/v2latest 4、查看bee版本 5、进行打包然后传到Centos和麒麟服务器如下代码 bee pack -be GOOSlinux -be GOARCHa…

Instagram和facebook广告对比解析

一、平台用户画像对比 用户基础数据 &#xff08;1&#xff09;活跃用户规模 Instagram&#xff1a;20亿MAU&#xff0c;以年轻群体为主力 Facebook&#xff1a;29亿MAU&#xff0c;覆盖全年龄段用户 &#xff08;2&#xff09;核心用户特征 Instagram&#xff1a; • 25-3…

[MIA 2025]CLIP in medical imaging: A survey

论文网址&#xff1a;CLIP in medical imaging: A survey - ScienceDirect 项目页面&#xff1a;github.com 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏…

Python通讯录系统实战教程

具体介绍见 通讯录管理系统设计与实现&#xff08;C&#xff09;-CSDN博客 class Person:def __init__(self, name"", sex0, age0, phone"", addr""):self.m_name name # 姓名self.m_Sex sex # 性别&#xff08;1-男&#xff0c;2-女…

虾米壁纸分类页面代码

<template> <view class"wallpaper-category"> <custom-nav-bar title"分类列表"></custom-nav-bar> <!-- 分类展示 --> <scroll-view scroll-y class"category-scroll-view"> <view cl…

K8s-pod 调度基础

目录 Replication Controller&#xff08;RC&#xff09; 概念 关键字段 Replica Set&#xff08;RS&#xff09; 概念 关键字段 RC 与 RS 的区别 无状态应用管理Deployment 无状态应用&#xff08;Stateless Application&#xff09; 什么是无状态&#xff1f; 无状…

Vue + RuoYi 前后端分离入门手册

Vue RuoYi 前后端分离技术栈是一个非常流行且成熟的企业级后台管理系统开发方案&#xff0c;尤其在国内 Java 开发社区中广泛应用。它结合了现代化的前端框架 Vue.js 和基于 Spring Boot 的后端框架 RuoYi&#xff0c;提供了开箱即用的权限管理、代码生成、监控等功能&#xf…

JSON 安装使用教程

一、JSON 简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。它广泛应用于前后端数据通信、配置文件、API 传输等场景。 二、JSON 是否需要安装&#xff1f; 不需要…

十大网络协议

十大网络协议 标题1. HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;标题2. HTTPS&#xff08;Secure Hypertext Transfer Protocol&#xff0c;安全超文本传输协议&#xff09;标题3. HTTP/3标题4. TCP&#xff08;Transmission Control…

【语音告警】博灵智能语音报警灯Modbus TCP触发告警实例-语音报警灯|声光报警器|网络信号灯

功能说明 本文将以Python代码为例&#xff0c;讲解如何通过Python代码调用博灵语音通知终端A4实现声光语音告警。 本代码实现Python触发Modbus写多寄存器和写单寄存器实现调用通知终端模板播报功能&#xff08;通知终端内置TTS语音合成技术&#xff0c;本案例不讲解如何文本转…

摄像头 rtsp数据量 和正常数据流有什么区别

摄像头RTSP数据流和正常数据流&#xff08;如HTTP传输的普通文件或网页数据&#xff09;在多个方面存在显著差异&#xff0c;主要体现在协议特性、数据量、实时性、应用场景等方面。以下是具体对比&#xff1a; 1. 协议与传输方式 RTSP流&#xff1a; 实时流协议&#xff08;R…