zoukankan      html  css  js  c++  java
  • [读书笔记] 为什么绝不在构造/析构函数中调用virtual函数

    ------------恢复内容开始------------

    我们想象这样一个情况,有一个基类base,和派生类A,在基类中,有一个虚函数log,并且在A中重载了这个虚函数log。我们在base的构造函数中,调用了这个虚函数log。

    当我们创建一个A的实例时,会发生什么呢。

    无疑会有一个A的构造函数调用,但是base类的构造函数会被更早调用。

    derived class对象内的base class成分会在自身成分构造之前,先构造妥当,那么在base类的构造函数中,调用了虚函数log,这里就是引发惊奇的起点。

    这里调用的log函数是base内的版本,不是A内的版本,即使要建立的对象类型是A。

    在base class构造期间 virtual 函数绝不会下降到derived层次。

    (如果你执行的是derived层次的虚函数,而derived class中的成员变量没有初始化,那就会导致不明确行为)

    在derived class对象的base class构造期间,对象的类型其实是base class而不是derived class。

    相关条款在第09条 《Effective C++》有更加详细的说明。

    总之提炼原因是

    在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class

    ------------恢复内容结束------------

  • 相关阅读:
    全栈必备Linux 基础
    Linux 的 Socket IO 模型
    Vim
    Linux 下使用 Sar 简介
    提高效率,推荐 5 款命令行工具
    Vim小技巧
    剑指Offer 矩形覆盖
    剑指Offer 变态跳台阶
    剑指Offer 跳台阶
    2016 网易校招内推C/C++第二场8.6
  • 原文地址:https://www.cnblogs.com/EvansPudding/p/12549108.html
Copyright © 2011-2022 走看看