首页 >后端开发 >C++ >为什么在基类构造函数中调用虚函数会导致使用基类实现?

为什么在基类构造函数中调用虚函数会导致使用基类实现?

Barbara Streisand
Barbara Streisand原创
2024-12-21 02:03:15779浏览

Why Does Calling a Virtual Function in a Base Class Constructor Result in the Base Class Implementation Being Used?

重写构造函数中的虚拟函数

考虑以下代码片段:

#include <iostream>
struct base {
  virtual const int value() const {
    return 0;
  }

  base() { // Default constructor
    std::cout << value() << std::endl;
  }
};

struct derived : public base {
  virtual const int value() const {
    return 1;
  }
};

int main() {
  derived d; // Declares an instance of the derived class
}

当我们运行此代码时,它打印 0 而不是预期的 1。为什么?

构造期间的虚函数调用

当基类构造函数在构造函数中调用虚函数时,虚函数是在基类实例上调用的,而不是在基类实例上调用的派生类实例。这是对象在构造过程中“成熟”过程的结果。

  • 成熟:当对象被构造时,它从基类构造函数开始,逐渐“成熟” " 转换为派生类类型。

在我们的示例中,当部分构造对象时,基本构造函数调用 value()。此时,该对象尚未“成熟”为派生对象。因此,调用了 value() 的原始基本实现。

如何解决问题

要使代码打印 1,可以避免调用虚函数在构造函数中。这可以通过以下方式实现:

  1. 使用指针:从基类的指针或引用调用虚函数,而不是直接从其成员函数调用:

    base* b = new derived();
    b->value(); // Calls the derived class implementation
    
    delete b;
  2. 使用成员初始化列表: 使用成员初始化列表在构造函数中显式指定虚函数的值:

    derived d : base() { } // Initializes `base()` and the virtual function
                           // call to occur within the constructor
  3. 以上是为什么在基类构造函数中调用虚函数会导致使用基类实现?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn