重写构造函数中的虚拟函数
考虑以下代码片段:
#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,可以避免调用虚函数在构造函数中。这可以通过以下方式实现:
使用指针:从基类的指针或引用调用虚函数,而不是直接从其成员函数调用:
base* b = new derived(); b->value(); // Calls the derived class implementation delete b;
使用成员初始化列表: 使用成员初始化列表在构造函数中显式指定虚函数的值:
derived d : base() { } // Initializes `base()` and the virtual function // call to occur within the constructor
以上是为什么在基类构造函数中调用虚函数会导致使用基类实现?的详细内容。更多信息请关注PHP中文网其他相关文章!