首页 > 后端开发 > C++ > 为什么从构造函数调用的 C 虚拟函数返回基类值?

为什么从构造函数调用的 C 虚拟函数返回基类值?

Susan Sarandon
发布: 2024-12-06 13:24:12
原创
693 人浏览过

Why Do C   Virtual Functions Called from a Constructor Return the Base Class Value?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板