为什么不能从构造函数调用虚函数
在 C 中,虚函数通过启用派生对象,在多态性中发挥着至关重要的作用类重写从其基类继承的方法。然而,当尝试从类构造函数中调用虚函数时,会出现一个常见的误解。
考虑以下示例代码:
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; }
当此代码执行时,它输出“0”而不是预期的“1”。为什么?
原因在于构造函数的执行顺序。创建派生类对象时,首先调用基类构造函数。此时,派生类对象尚未完全构造完成,其虚方法无法可靠调用。
当基类构造函数调用 value() 时,会访问基类的虚函数实现,因为派生类尚未“成熟”为派生对象。为了确保正确调用虚函数,必须从完全构造的对象中访问它们。
因此,要修复代码并输出“1”,基类构造函数中的 value() 方法调用必须是删除或推迟到对象完全构造完成之后。
以上是为什么构造函数中调用的虚函数返回基类实现?的详细内容。更多信息请关注PHP中文网其他相关文章!