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

为什么构造函数中调用的虚函数返回基类实现?

Mary-Kate Olsen
发布: 2024-12-10 11:48:34
原创
345 人浏览过

Why Do Virtual Functions Called in a Constructor Return the Base Class Implementation?

为什么不能从构造函数调用虚函数

在 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中文网其他相关文章!

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