工作随记-构造调用虚函数

工作随记-构造调用虚函数

  • 代码编译警告
      • 原因
      • 解决方法
      • 示例
      • 代码重构示例
      • 总结

代码编译警告

Call to virtual method 'CoordinateConversionTool::Reset' during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]

这个警告信息来自 Clang 静态分析工具,指出在构造函数中调用了虚函数 CoordinateConversionTool::Reset,这会绕过虚拟调度机制。C++ 中,在构造函数和析构函数中调用虚函数是不安全的,因为在这些情况下,虚函数不会表现为虚函数,而是表现为普通的成员函数调用。

原因

在 C++ 中,当一个对象的构造函数正在执行时,对象的多态性尚未完全建立。具体来说,基类的构造函数调用时,派生类的构造函数还没有被调用,因此调用虚函数会导致调用基类的实现,而不是派生类的实现。

解决方法

要解决这个问题,可以通过以下几种方式:

  1. 避免在构造函数中调用虚函数。可以将虚函数调用移动到构造函数外部,比如在对象构造完成后再调用。
  2. 使用初始化函数。定义一个非虚的初始化函数,在构造函数中调用这个初始化函数,避免直接调用虚函数。

示例

假设你有以下代码:

class CoordinateConversionTool {
public:
    CoordinateConversionTool() {
        Reset(); // 这里调用了虚函数
    }

    virtual ~CoordinateConversionTool() {}

    virtual void Reset() {
        // 虚函数实现
    }
};

可以重构为:

class CoordinateConversionTool {
public:
    CoordinateConversionTool() {
        Initialize();
    }

    virtual ~CoordinateConversionTool() {}

    virtual void Reset() {
        // 虚函数实现
    }

private:
    void Initialize() {
        // 在这里调用虚函数
        Reset();
    }
};

代码重构示例

如果你的 CoordinateConversionTool 类如下:

class CoordinateConversionTool {
public:
    CoordinateConversionTool() {
        Reset(); // 这里调用了虚函数
    }

    virtual ~CoordinateConversionTool() {}

    virtual void Reset() {
        // 虚函数实现
    }
};

重构为:

class CoordinateConversionTool {
public:
    CoordinateConversionTool() {
        Initialize();
    }

    virtual ~CoordinateConversionTool() {}

    virtual void Reset() {
        // 虚函数实现
    }

private:
    void Initialize() {
        // 在这里调用虚函数
        Reset();
    }
};

这样,在 Initialize 函数中调用虚函数 Reset,以确保在对象完全构造后才调用虚函数。

总结

通过将虚函数调用移到一个非虚的初始化函数中,可以避免在构造函数中直接调用虚函数,从而避免 Clang 静态分析工具发出的警告,并确保代码的正确性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

精准测试与传统的手工测试

大部分测试从业人员都经历了手工测试到自动化测试递进,测试技术及思路都发生了日新月异的变化,有些中厂及大厂都有一套强大且复杂的自动化测试用例时刻保障产品的稳定性及正确性。 所谓精准测试,就是借助一定的技术手段、通过算法的辅助对传…

虚拟机拖拽文档造成缓存过大

查看文件夹大小:du -h --max-depth1 缓存位置:~/.cache/vmware/drag_and_drop 删除:rm -fr ~/.cache/vmware/drag_and_drop 释放了3GB

解决Few-shot问题的两大方法:元学习与微调

基于元学习(Meta-Learning)的方法: Few-shot问题或称为Few-shot学习是希望能通过少量的标注数据实现对图像的分类,是元学习(Meta-Learning)的一种。 Few-shot学习,不是为了学习、识别训练集上的数据,泛化…

深入理解前端缓存

前端缓存是所有前端程序员在成长历程中必须要面临的问题,它会让我们的项目得到非常大的优化提升,同样也会带来一些其它方面的困扰。大部分前端程序员也了解一些缓存相关的知识,比如:强缓存、协商缓存、cookie等,但是我…

后端程序员的Linux命令指南

后端程序员的终极命令指南:考考自己是不是真正掌握Linux的使用 欢迎各位穿着格子衬衫,常年抱着键盘睡觉的后端小伙伴们👋👋👋!今天,考考你们是不是掌握以下让你们在日后在服务器上叱咤风云的命令…

vscode颜色没有显示出来颜色预览效果,安装插件解决

1、先上一张图,看看之前没有安装插件的Html颜色的色块 2、安装插件Color Highlight 这样颜色对应的效果就出来了。

O2OA的数据库数据库配置-使用不同用户访问Oracle时报错-表或视图不存在

在使用Oracle数据库时,多个O2OA服务器同一个Oracle实例中使用不同的用户启动时,可能会遇到数据库访问的错误。本篇阐述此类问题以及解决方案。 一、先决条件: 1、O2OA已经下载并且解压到指定的目录; 2、Oracle数据库已经完成安…

同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?

在智能手机的世界里,续航能力一直是用户关注的焦点。苹果公司以其创新的MagSafe技术和传统的Lightning接口,为iPhone用户提供了多样化的充电解决方案。 然而,当这两种技术同时使用时,它们能否带来更快的充电速度?本文…

“用友审批+民生付款”,YonSuite让企业发薪更准时

随着现代企业经营模式的不断创新和市场竞争的加剧,企业薪资管理和发放的效率、准确性和及时性已成为企业管理的重要一环。然而,在实际操作中,许多企业面临着薪资管理复杂、发放流程繁琐、数据不准确等难点和痛点。为了解决这些问题&#xff0…

【Java】已解决java.net.UnknownHostException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.UnknownHostException异常 在Java的网络编程中,java.net.UnknownHostException是一个常见的异常,它通常表明在尝试解析主机名时出现了问题。…

全网首测!文生软件平台码上飞CodeFlying,效果炸裂!

前言: 提到AIGC,在大家的印象中应该就是让AI自己生成文字,图片等内容吧。随着今年Sora,Suno的爆火,将AIGC的应用场景又拉到了一个新的高度,为人们带来了更多的遐想。在未来,或许可以用AI来生成…

人声分离的5个方法分享,从入门到精通,伴奏提取手拿把捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来,使得用户可以单独处理或重混音频,创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具,这一过程往往会比较困难。…

车辆轨迹预测系列 (二):常见数据集介绍

车辆轨迹预测系列 (二):常见数据集介绍 文章目录 车辆轨迹预测系列 (二):常见数据集介绍1、NuScenes (2020):1、下载2、说明 2、Waymo Open Dataset (2020):1、介绍2、概述3、下载4、教程5、参考 3、Lyft Level 5 (2020)&#xff…

智慧办公新篇章:可视化技术引领园区管理革命

随着科技的飞速发展,办公方式也在经历着前所未有的变革。在这个信息爆炸的时代,如何高效、智能地管理办公空间,成为了每个企业和园区管理者面临的重要课题。 智慧办公园区作为未来办公的新趋势,以其高效、便捷、智能的特点&#x…

鸿蒙NEXT实战开发: 依据前端对http请求进行二次简单封装

一、为什么要对http请求进行封装? 在我看来二次封装有一下几点好处 代码封装之后,开发人员只用关注业务层面的东西,不用去过多浪费时间在接口请求数据处理上。封装之后代码更加简洁,通俗易懂,方便后期维护&#xff0…

数据库讲解---(数据库保护)【上】

目录 一.事务 1.1事务的概念【重要】 1.2事务的特性【重要】 1.2.1原子性(Atomicity) 1.2.2一致性(Consistency) 1.2.3隔离性(Isolation) 1.2.4持久性(Durability) 二.数据库恢复 2.1数据库系统的故障 2.1.1事务内部故障 2.1.2系统故障 2.1.3介质故障 2.1.4计算机…

甘肃的千层烤馍:传统面点的魅力绽放

千层烤馍,作为甘肃美食文化的重要象征,以其独特的外形和丰富的口感,吸引着众多食客。它的外观犹如一件精美的艺术品,层层叠叠,金黄酥脆,散发着诱人的香气。 在甘肃平凉地区制作千层烤馍&#xff0c…

详解|什么样的SSL证书能助力企业通过等保与密评?

企业在过等级保护(简称“等保”)与密码评测(简称“密评”)的时候,SSL证书作为网络安全的基础组件之一,其选择与部署对于企业顺利通过等保测评与密评至关重要。那什么样的SSL证书能够有效助力企业达成这一目…

gbase8s之Encoding or code set not supported

如图发生以下错误: 解决办法:在url里加上ifx_use_strenctrue 就可以了 参数解释:

镜像发布至dockerHub

1、login 没有账号的话去注册一个 https://hub.docker.com docker login 输入账号密码和账号2、修改镜像名格式 可以直接招我的修改 格式为你的 hub名/镜像名 3、推送