我有时会注意到在我的计算机上崩溃的程序中会出现错误:“纯虚拟功能调用”。

当无法创建抽象类的对象时,这些程序如何编译?

答案

如果您尝试从构造函数或破坏者进行虚拟函数调用,它们可能会导致。由于您无法从构造函数或驱动器中进行虚拟函数调用(尚未构造或已经破坏了派生的类对象),因此它调用了基类版本,在纯虚拟函数的情况下,存在。

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

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

int main(void)
{
    Derived d;  // This will cause "pure virtual function call" error
}

另请参阅Raymond Chen的2 有关该主题的文章

来自: stackoverflow.com