首页 >后端开发 >C++ >为什么在基类构造函数中调用虚函数会打印基类值,而不是派生类值?

为什么在基类构造函数中调用虚函数会打印基类值,而不是派生类值?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-21 05:24:10406浏览

Why Does Calling a Virtual Function in a Base Class Constructor Print the Base Class Value, Not the Derived Class Value?

虚函数的构造函数调用

在 C 中,构造函数负责初始化对象。但是,在处理派生类和虚函数时,可能会出现可能不会立即直观的特定行为。

考虑以下示例:

#include <iostream>

struct base {
   virtual const int value() const {
      return 0;
   }
   base() {
      std::cout << value() << std::endl;
   }
   virtual ~base() {}
};

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

int main(void) {
   derived example;
}

在此示例中,我们有一个基础具有虚函数 value() 的类基。派生类继承自基类并重写 value()。 base 中的构造函数尝试在其构造函数中调用 value()。

当调用派生的构造函数时,首先调用 base 的构造函数。此时,该对象仍处于基类的状态,并且 value() 解析为基类的实现。这就是为什么程序打印“0”而不是预期的“1”。

要解决这个问题,我们需要确保在构造函数中调用 value() 之前该对象已完全初始化为派生类。实现此目的的一种方法是延迟对 value() 的调用,直到执行派生类的构造函数之后,这可以通过在派生类构造函数中使用虚函数来完成。

以上是为什么在基类构造函数中调用虚函数会打印基类值,而不是派生类值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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