C.82: Don't call virtual functions in constructors and destructors

C.82:不要在构造函数或析构函数中调用虚函数

Reason(原因)

The function called will be that of the object constructed so far, rather than a possibly overriding function in a derived class. This can be most confusing. Worse, a direct or indirect call to an unimplemented pure virtual function from a constructor or destructor results in undefined behavior.

到目前为止,被调用的函数应该只属于构造对象本身,而不是可能存在于派生类中的某个覆盖函数。那样做非常难理解。最坏的情况,在构造函数或者析构函数中直接或间接调用一个没有实现的纯虚函数会导致没有定义的行为。

Example, bad(反面示例)

class Base {
public:virtual void f() = 0;   // not implementedvirtual void g();       // implemented with Base versionvirtual void h();       // implemented with Base versionvirtual ~Base();        // implemented with Base version
};class Derived : public Base {
public:void g() override;   // provide Derived implementationvoid h() final;      // provide Derived implementationDerived(){// BAD: attempt to call an unimplemented virtual functionf();// BAD: will call Derived::g, not dispatch further virtuallyg();// GOOD: explicitly state intent to call only the visible versionDerived::g();// ok, no qualification needed, h is finalh();}
};

Note that calling a specific explicitly qualified function is not a virtual call even if the function is virtual.

注意:调用一个特定的限定函数不是虚调用,即使这个函数是虚函数。

See also factory functions for how to achieve the effect of a call to a derived class function without risking undefined behavior.

参考工厂函数以便了解如何达成调用派生类功能的效果而不必承担引起未定义行为的风险。

Note(注意)

There is nothing inherently wrong with calling virtual functions from constructors and destructors. The semantics of such calls is type safe. However, experience shows that such calls are rarely needed, easily confuse maintainers, and become a source of errors when used by novices.

从构造函数和析构函数中调用虚函数并不是本身有什么错误。这种调用的语义是安全的。然而,经验表明这样的调用很少是必须的,很容易扰乱维护者,如果被新手使用会成为错误源。

Enforcement(实施建议)

  • Flag calls of virtual functions from constructors and destructors.

  • 提示来自构造函数或析构函数的虚函数调用。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c82-dont-call-virtual-functions-in-constructors-and-destructors


觉得本文有帮助?欢迎点赞并分享给更多的人。

更新文章,请关注微信公众号【面向对象思考】

C++核心准则C.82:不要在构造函数或析构函数中调用虚函数相关推荐

  1. (c++)5.4构造函数和析构函数中调用虚函数

    在构造函数和析构函数中调用虚函数时,采用静态联编(他们所调用的虚函数是自己类中定义的函数) 如果在自己类中没有实现这个虚函数,则调用的是基类中的虚函数,绝不会是任何在派生类中重定义的虚函数 //构造函 ...

  2. C++中最好不要在构造函数和析构函数中调用虚函数!!!

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

  3. C++中最好不要在构造函数和析构函数中调用虚函数

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

  4. C++学习笔记-----不要在构造函数和析构函数中调用虚函数

    考虑下面的程序: #include <iostream> using namespace std;class Base { public:Base() { cout << &q ...

  5. C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配

    一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...

  6. C# 构造函数中调用虚函数

    C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...

  7. 在构造函数/析构函数中调用virtual函数带来的影响

    在构造函数/析构函数中调用virtual函数,那么调用的一定是本类中的virtual函数. 先看一段代码: #include<iostream>class Base { public:Ba ...

  8. C++:构造函数和析构函数能否为虚函数

    C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. (1) 构造函数不能为虚函数 让我们来看看大牛C++之父 Bjarne Stroustrup ...

  9. 构造函数与析构函数能否为虚函数?

    C++C++C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数. 1.构造函数不能为虚函数 让我们来看看大牛C++C++C++之父 BjarneB ...

最新文章

  1. 编程软件python中的if用法-Python高效编程的19个技巧
  2. C#开发Android应用的必备——Mono for Android V1.0 发布
  3. python翻页_python实现电子书翻页小程序
  4. muduo学习笔记 - 第2章 线程同步精要
  5. 定时器timerfd
  6. wireshark分析SIP协议——注册
  7. 【php-laravel框架】第二节:laravel常用的扩展包汇总及安装教程
  8. 蓝桥杯51单片机之独立按键控制数码管【单片机开发初学者必学会】
  9. 基于Windows Server 2019域环境体验Veeam ONE 10安装
  10. springboot 配置全局响应数据_spring boot 全局事务配置
  11. pandas_空值填充|重复数据|异常数据
  12. win10官网下载ios文件操作指南
  13. Python3.5爬取cbooo.cn数据并且同步到mysql中
  14. 在线制作html个人简历,HTML制作个人简历的简单实现
  15. vue-cli 项目打包后 代理接口报404错误 解决办法!
  16. springboot毕设项目社区健康服务系统h9bpy(java+VUE+Mybatis+Maven+Mysql)
  17. 第二次作业:网易云音乐案例分析
  18. 《Spring实战》第二章读书笔记
  19. Go 语言重要知识点:字符串、UTF-8 编码、rune
  20. jeecgBoot 状态默认设置

热门文章

  1. 华为防火墙NAT黑洞路由防御
  2. 《Python编程从入门到实践 第2版》 读后感
  3. 男人为什么总想搞自己的初恋-带走了我一整个青春的女孩
  4. 天纵智能软件快速开发年度变化曲线分析插件
  5. 游戏建模软件大PK,没想到赢家却是他
  6. favicon.ico给网站加图标不显示问题
  7. 小程序ajax返回html,微信小程序封装Ajax请求
  8. 获取用户下线时间的实现思路
  9. html5 仿手机聊天,HTML5仿手机微信聊天界面
  10. [资料整理]魔法师传奇 MagicMayhem