首页  >  文章  >  后端开发  >  为什么构造函数和析构函数会出现'纯虚函数调用”错误?

为什么构造函数和析构函数会出现'纯虚函数调用”错误?

DDD
DDD原创
2024-11-12 12:16:01635浏览

Why Do

揭开“纯虚函数调用”崩溃之谜

在编程领域,遇到“纯虚函数调用”崩溃的情况“错误可能会令人困惑,让开发人员摸不着头脑。本文旨在阐明这些难以捉摸的错误背后的根本原因。

纯虚函数的抽象本质

纯虚函数是对象的一个​​基本方面 -面向编程,允许在抽象类中声明必须在派生类中实现的函数。按照设计,纯虚函数在抽象类中没有实现。

罪魁祸首:构造函数和析构函数调用

但是,当虚函数调用是从构造函数或析构函数中尝试。在这种情况下,一个固有的限制就会发挥作用:在对象初始化或销毁期间不允许进行虚拟函数调用。此限制背后的原因在于派生类对象在其存在的这些阶段中处于不完整状态。

基类调用

由于此禁止,来自构造函数或析构函数的虚拟函数调用会导致调用该函数的基类版本。如果纯虚函数没有基类实现,这就会出现问题,这在抽象类中很常见。

示例

为了说明问题,考虑以下 C 代码:

class Base {
public:
    Base() { reallyDoIt(); }
    void reallyDoIt() { doIt(); } // DON'T DO THIS
    virtual void doIt() = 0;
};

class Derived : public Base {
    void doIt() {}
};

int main() {
    Derived d; // Triggers "pure virtual function call" error
}

在此示例中,基类中的 realDoIt() 函数调用 doIt() 函数。但是,由于 doIt() 是纯虚函数,因此基类没有它的实现。因此,当创建派生类对象时,它会尝试从构造函数调用 doIt() 函数,从而导致可怕的“纯虚函数调用”错误。

其他资源

要更深入地了解这个主题,请参阅 Raymond Chen 就该主题撰写的富有洞察力的文章:

  • [Raymond Chen 的博客:“纯虚函数和 Vptr”(部分) 1)](https://devblogs.microsoft.com/oldnewthing/2007/12/18/pure-virtual-functions-and-the-vptr/)
  • [Raymond Chen 的博客:“纯虚函数和 Vptr”(第 2 部分)](https://devblogs.microsoft.com/oldnewthing/2007/12/20/pure-virtual-functions-and-the-vptr-part-deux/)

以上是为什么构造函数和析构函数会出现'纯虚函数调用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn