C++ "Pure Virtual Function Being Called"失败

C++ Failing on "Pure Virtual Function Being Called"

本文关键字:Called 失败 Being Virtual Pure C++ Function      更新时间:2023-10-16

我正在编写一些代码以从AVL树中删除。下面是一个有助于删除的示例函数:

int AVL::getLargestAndTrim(Node*& currentNode, Node* parentNode) {
    if (currentNode->right == nullptr) {
        int returnData = currentNode->data;
        parentNode->right = currentNode->left;
        delete currentNode;
        return returnData;
    }
    else {
        Node* rightChild = currentNode->right;
        return this->getLargestAndTrim(currentNode->right, currentNode);
    }
}

该代码不断失败,消息"纯虚拟方法调用终止调用而不出现活动异常"。

现在,如果我更换行

return this->getLargestAndTrim(currentNode->right, currentNode);

return this->getLargestAndTrim(rightChild, currentNode);

它工作正常。如何?

编辑:节点类定义为:

class Node {
    public:
        Node() {}
        Node(int data) : data(data) {}
        ~Node() {}
    private:
        int data = 0;
        Node* left = nullptr;
        Node* right = nullptr;
        int height = 0;
    friend class AVL;
};

你的序列

parentNode->right = currentNode->left;
delete currentNode;

是错误的。 因为currentNode是对parentNode->right的引用,所以当你进行赋值时,它会改变currentNode的值,然后你删除了currentNode->left中的内容,同时在树中有一个悬空的指针指向已删除的数据。

稍后,当为已删除的对象调用析构函数时,您将收到错误。