虚函数的构造函数调用
在 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中文网其他相关文章!