深入理解C++ 虚函数

        C++ 中的虚函数(virtual function)是面向对象编程中的一个重要概念,它允许子类重新定义从父类继承的方法。当子类对象被当作父类对象使用时,可以通过子类的方法实现来调用子类的方法,而不是父类的方法。这就是多态(polymorphism)的一种表现。

深入理解 C++ 虚函数,我们需要掌握以下几个关键点:

  1. 虚函数的声明和定义:在父类中,使用 virtual 关键字声明一个函数为虚函数。在子类中,可以重写(override)这个函数,即使用相同的函数名和参数列表。

    class Parent {  
    public:  virtual void foo() {  std::cout << "Parent's foo()" << std::endl;  }  
    };  class Child : public Parent {  
    public:  void foo() override {  std::cout << "Child's foo()" << std::endl;  }  
    };

  2. 动态绑定(Dynamic Binding):当通过基类指针或引用调用虚函数时,实际调用的是运行时对象的实际类型所定义的函数。这被称为动态绑定或晚期绑定。

    int main() {  Parent* ptr = new Child();  ptr->foo();  // 输出 "Child's foo()"  delete ptr;  return 0;  
    }

  3. 纯虚函数(Pure Virtual Function):一个虚函数在类定义中不给出实现(即没有函数体),而是在声明后面直接加 = 0,这样的函数称为纯虚函数。包含纯虚函数的类称为抽象类,不能直接实例化。子类必须提供纯虚函数的实现,才能创建对象。

    class Abstract {  
    public:  virtual void bar() = 0;  // 纯虚函数  
    };  class Concrete : public Abstract {  
    public:  void bar() override {  std::cout << "Concrete's bar()" << std::endl;  }  
    };

  4. 虚析构函数(Virtual Destructor):如果一个类被设计为基类,并可能被删除,那么它应该有一个虚析构函数。这是因为在删除子类对象时,如果析构函数不是虚的,那么只会调用基类的析构函数,而不会调用子类的析构函数,这可能导致资源泄露。

    class Parent {  
    public:  virtual ~Parent() {  // 释放资源  }  
    };  class Child : public Parent {  
    public:  ~Child() {  // 释放子类特有的资源  }  
    };

  5. 虚函数表(Virtual Function Table):C++ 通过虚函数表来实现动态绑定。每个包含虚函数的类都有一个虚函数表,其中包含了指向虚函数的指针。每个对象都有一个指向其类虚函数表的指针。当通过基类指针或引用调用虚函数时,会先查找对象的虚函数表,然后找到对应的函数进行调用。
  6. 总之深入理解虚函数及其相关概念,可以帮助我们更好地利用面向对象编程的优势,实现代码的复用和扩展。

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

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

相关文章

Java 播放音频

Java 播放音频 1 依赖2 接口3 实现4 测试 1 依赖 <dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version> </dependency><!-- 如果需要解码播放flac文件则引…

PS自由变换的小技巧--墙面广告牌

墙面广告牌&#xff0c;如何用PS做出看上去特别真实的一个效果 1.首先&#xff0c;我们会有墙面跟广告栏2个图层 2.然后将广告牌复制一层 3.接着用钢笔工具画出墙面的透视&#xff0c;也就是两条线&#xff0c;这两条线的交叉点就是墙面的透视点 4.接着选中广告牌复制图层&…

杨氏矩阵和杨辉三角

杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N); 分析 若要满足要求时间复杂度小于O(N)&#xff0c;就不能每一行一个个…

spring工具类

/*** spring工具类 方便在非spring管理环境中获取bean* */ Component public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware {/** Spring应用上下文环境 */private static ConfigurableListableBeanFactory beanFactory;private sta…

macad.common解析properties,evaluator

1.properties using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices;// 将 ComVisible 设置为 false 使得此程序集中的类型对 COM 组件不可见。 // 如果需要从 COM 访问此程序集中的类型&#xff0c;请将 ComVisible 属性设…

算法:带权重随机算法

算法思想&#xff1a;对象权重 / 所有对象权重总和即每个对象相对应的概率 public static void main(String[] args) throws IOException {//初始化每个人的权重//1.从文件中导入数据到集合BufferedReader br new BufferedReader(new FileReader("D:\\zzz.txt"));//…

TCP流量控制+拥塞控制

流量控制&#xff1a; 目标&#xff1a;流量控制主要解决的是发送方和接收方之间处理能力的不匹配问题。它的目的是确保发送方不会发送数据过快&#xff0c;以至于接收方无法及时接收并处理这些数据&#xff0c;从而避免数据包在网络中堆积和丢失。实现方式&#xff1a;在TCP协…

【.NET Core】深入理解async 和 await 理解

【.NET Core】深入理解async 和 await 理解 文章目录 【.NET Core】深入理解async 和 await 理解一、概述二、async异步执行机制理解三、async与await应用3.1 async与await简单应用3.2 带有返回值async与await应用 四、async和await中常见问题总结4.1 当方法用async标识时&…

MySql5.7之ERROR 1045 (28000)问题处理

MySql5.7之ERROR 1045 (28000)问题处理 文章目录 MySql5.7之ERROR 1045 (28000)问题处理1. ERROR 1045 (28000)问题2.问题原因3. 解决方法(重置密码)1. 修改my.ini配置2. 修改密码3. 刷新权限4. 再次修改my.ini配置 1. ERROR 1045 (28000)问题 时隔多日连接MySQL时出现了"…

7条策略,提升可视化大屏的科技感,值得收藏。

以下是从设计角度上提升科技感的几条建议&#xff1a; 使用现代化的字体&#xff1a; 选择现代化的字体能够让大屏幕看起来更加科技感。比如&#xff0c;Sans-serif字体、Roboto字体、Lato字体等都是现代化的字体。 设计简洁、清晰的图表&#xff1a; 图表是可视化大屏设计中…

端口号被占用怎么解决

1、快捷键"winR"打开运行&#xff0c;在其中输入"cmd"命令&#xff0c;回车键打开命令提示符。 2、进入窗口后&#xff0c;输入"netstat -ano"命令&#xff0c;可以用来查看所有窗口被占用的情况。 比如端口号为7680的端口被占用了&#xff0c…

id生成相关工具类

目录 1. ID生成器工具类 -- IdUtils 2. 唯一识别码生成 -- UUID 1. ID生成器工具类 -- IdUtils /*** ID生成器工具类* */ public class IdUtils {/*** 获取随机UUID* * return 随机UUID*/public static String randomUUID(){return UUID.randomUUID().toString();}/*** 简…

一次失败的面试经历:我只想找个工作,你却用面试题羞辱我

金三银四就要来了&#xff0c;即将又是一波求职月&#xff0c;面对跳槽的高峰期&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取 小王最近为面试已经焦…

Docker 数据卷

Docker 数据卷 一、介绍二、数据卷的使用1 添加数据卷2 只读权限数据卷 一、介绍 数据卷就是目录或文件&#xff0c;用来与宿主机/容器共享数据的。 数据卷的生命周期一直持续到没有容器使用它为止。 二、数据卷的使用 1 添加数据卷 运行一个centos容器是直接添加 docker …

循环测试之旅 —— 深度解析Pytest插件 pytest-repeat!

在软件开发中&#xff0c;测试的重要性不言而喻。而为了提高测试的鲁棒性和可靠性&#xff0c;Pytest插件 pytest-repeat 应运而生。这个插件可以帮助你轻松实现测试用例的循环运行&#xff0c;以更全面地评估代码的稳定性。本文将深入介绍 pytest-repeat 插件的基本用法和实际…

msvcp140.dll丢失要怎么处理的一些解决方法,分享一些解决办法

在Windows操作系统中&#xff0c;有时候我们会遇到一些dll文件丢失或损坏的问题。其中一个常见的错误是"找不到msvcp140.dll"。这个错误会导致一些应用程序无法正常运行&#xff0c;给我们的电脑使用带来了很大的困扰。不用担心&#xff0c;今天我们就来说说由于找不…

OpenAI视频生成模型Sora的全面解析:从ViViT、扩散Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0、W.A.L.T》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

Java自旋锁

概念 自旋锁&#xff08;Spinlock&#xff09;是一种特殊的锁&#xff0c;用于解决多线程同步问题。与常规锁&#xff08;如synchronized关键字或ReentrantLock&#xff09;不同&#xff0c;自旋锁在尝试获取锁时&#xff0c;如果锁已经被其他线程持有&#xff0c;那么当前线程…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_4

《剑指Offer》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列2. LCR 14…

简单贪吃蛇模拟(C语言版本·)

简单贪吃蛇模拟&#xff08;C语言版本&#xff09; 一、所需win32 API知识二、游戏逻辑实现 一、所需win32 API知识 1.在这儿&#xff0c;直接弱化概念&#xff0c;把在贪吃蛇中用到的API知识说一下&#xff01;  1.1用cmd命令来设置控制台窗口的长宽   1.2.用title 指令…