为什么从构造函数调用的 C 虚函数可能会出现意外
在 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()。人们可能期望代码在运行时打印“1”,因为正在构造派生类型的对象。然而,它却输出“0”。
这种行为的原因在于对象构造的顺序。当初始化派生类型的对象时,首先调用基类构造函数。此时,该对象尚未完全初始化,并且可能尚未初始化其派生类特定的数据成员。因此,从基构造函数调用 value() 会调用该函数的基类实现,该实现返回 0。
要实现预期的行为,应该从后构造函数调用 value() 函数阶段,保证对象完全初始化。这可以通过重写派生类中的 value() 函数并从保证在构造后调用的单独方法调用它来完成。例如:
struct derived : public base { virtual const int value() const { return 1; } int get_value() const { return value(); } };
这种情况下,可以从构造函数中调用 get_value() 方法来获取正确的值“1”。
以上是为什么从构造函数调用的 C 虚拟函数返回基类值?的详细内容。更多信息请关注PHP中文网其他相关文章!