前言

最近在复习一些 C++基础知识,写了一些 C++的代码,当我在类中定义了虚函数并且直接在类定义内部实现这些虚函数时,编译器就会报警告:’xxx‘ has no out-of-line virtual method definitions;its vtable will be emitted in every translation unit.
如下图:

如何解决

以前好像从来没留意过这些问题,然后决定找找原因,后来查了一些资料终于找到真正的原因,来看一段话:
If a class is defined in a header file and has a vtable (either it has virtual methods or it derives from classes with virtual methods), it must always have at least one out-of-line virtual method in the class. Without this, the compiler will copy the vtable and RTTI into every .o file that #includes the header, bloating .o file sizes and increasing link times

这里大概意思就是:
如果在头文件中定义了一个类并且具有vtable(它具有虚方法或者它来自具有虚方法的类),则它必须始终在类中具有至少一个外联虚拟方法。 如果没有这个,编译器会将vtable和RTTI复制到每个.o文件中,其中#include标题,膨胀.o文件大小和增加链接时间。

也就是说,当类中定义了虚函数时,编译器会自动生成虚函数表vtable,用来对应每一个虚函数。那么,如果所有虚拟方法都是内联的(在头文件中定义),那么编译器不知道哪个翻译单元(.cpp文件)在其中发出vtable,因此它会在所有这些中发出一个副本,并且链接器会处理用它。这会在目标文件中产生额外的工作和并且是.o文件变得更庞大。另一方面,如果虚拟函数是在线外定义的(在.cpp中),则可以在那里发射vtable,因此只会发出一个副本。

所以知道以上原因过后,解决方法就很简单了,因为我是在类中定义了虚函数并且直接在类定义内部实现这些虚函数,所以将虚函数自动变成了内联函数,那么只需要把虚函数的实现挪到类的外面去实现就可以啦。

反思

1.本是一个习惯性的操作,有时候觉得定义的函数实现比较简单,所以就直接在类定义中实现,这就自动变成了内联函数,但是没想过不同的函数类型可能会带来不同的影响。
2.不要忽视编译器警告。通常我们在写代码,只要没出错就觉得万事大吉了,很少会去留意警告信息,但是其实警告信息也非常重要,因为它可能会成为今后软件出问题的一个导火线。
3.知其然,知其所以然。了解一些编译器的工作原理可以更有助于去改善代码质量。之前在看《深度探索C++对象模型》时深有感触。

C++ warning:’xxx‘ has no out-of-line virtual method definitions...相关推荐

  1. AD原理图编译WARNING:Net XXX has no driving source

    Altium designer WARNING系列: WARNING:Net XXX has no driving source 这篇博客填一下以前一篇关于Altium designer ERROR的 ...

  2. make: warning: file “xxx“ has modification time yyy s in the future 解决方法

    一.引言 最近在工作中,在本地将代码文件上传到远端服务器,在远端服务器进行 make 编译的时候,会报这样的错: make: Warning: File "xxx" has mod ...

  3. 【LaTex】LaTeX Warning: Citation xxx on page xxx undefined on input line xxx

    学习使用LaTeX时,引用参考文献时出现'?': 在控制台中输出: LaTeX Warning: Citation xxx on page xxx undefined on input line xx ...

  4. make: Warning: File “xxx“ has modification time yyy s in the future

    make: Warning: File "xxx" has modification time yyy s in the future 问题背景: 执行 gmake clean 打 ...

  5. keil5报警告warning:implicit declaration ‘xxxxxxxx’ is invalid in C99 大部分解决办法

    keil5报警告warning:implicit declaration 'xxxxxxxx' is invalid in C99 大部分解决办法 我遇到这个问题是在RM战队调裁判系统的时候遇到的. ...

  6. 解决“warning C280 ‘xxx‘ unreferenced local variable”告警方法

    再分享一个常见的告警提示,相信大家在刚接触C语言时候会遇到这种告警提示:"warning C280 'xxx' unreferenced local variable" 告警原因: ...

  7. 【解决】Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx

    [解决]Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx 参考文章: (1)[解决]Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * ...

  8. python程序打包时出现lib not found_pyinstaller打包py脚本Warning:lib not found等相关问题...

    小爬从使用Pyinstaller打包py为exe文件以来,一直都会碰到Warning:lib not found等相关问题,诸如: 虽然大多数时候,您像我一样忽略这些warning,打包后的exe也能 ...

  9. linux 设置pip 镜像 Pip Warning:–trusted-host 问题解决方案

    linux 设置pip 镜像 Pip Warning:–trusted-host 问题解决方案 参考文章: (1)linux 设置pip 镜像 Pip Warning:–trusted-host 问题 ...

最新文章

  1. 吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义 | AI ProCon 2019
  2. java json转换
  3. MYSQL 命令【精华帖】
  4. oracle executesqlcommand,Oracle Execute Command Sql Script in Win
  5. python django windows_Python和Django在Windows上的环境搭建
  6. 技术驱动还是产品驱动
  7. android升级SDK后,XML graphical layout无法预览的解决
  8. Lazy Evaluation(延迟执行)
  9. ES5常用的组合继承及原型链理解
  10. Event 事件对象 (target)帆软修改提示框样式
  11. 区块链 链上脚本、智能合约和Dapp的关系区别
  12. ios html清除缓存图片,iOS 清理文件缓存(示例代码)
  13. mybatis实现代码自动生成
  14. 数据分析2——探索性数据分析(多因子与复合分析)
  15. 解这道考研题要用克莱默法则的公式吗?
  16. 安装文件MyEclipse6.5安装与卸载SVN插件方法
  17. python 怎么输出实际的根号2_Python怎么输出根式?
  18. win7如何启用计算机的无线功能,win7如何开启无线功能
  19. No appenders could be found for logger
  20. 关于单片机替代PLC的思考

热门文章

  1. 重磅!2K图像90FPS,中科院开源轻量级通用人脸检测器
  2. 读不完的顶会Paper,我该如何读论文?
  3. MCtalk教育快报 | 0824
  4. 学会JavaScript函数式编程(第1部分)
  5. 【张其中】中本聪,我们究竟需要怎样的加密货币?
  6. Dynamic AX ERP 4.0 数据导出(上)
  7. 【转】Hibernate和IBatis对比
  8. Java开发中文件读取方式总结
  9. [原]Ubuntu桌面安装配置
  10. 【tensorflow】tf-tf.where(condition, x, y, name)