Создание класса с атрибутами этого типа класса + наследование другого класса (Node classs и NodeAVL) - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь сделать следующий код:

class Node
{
    protected:
        int *value;
        Node *leftChild;
        Node *rightChild;
        friend class BST;

    public:
        Node(int value = 0);
        virtual ~Node();
        virtual int info();
};

Node::Node(int value) : leftChild(nullptr), rightChild(nullptr) {
    this->value = new int(value);
    std::cout << "Creating the node " << *(this->value) << "\n";
}

class NodeAVL : public Node
{
    private:
        friend class AVL;
    public:
        int *balanceFactor;
        NodeAVL(int value = 0);
        virtual ~NodeAVL();
};

NodeAVL::NodeAVL(int value) : Node(value) {
    this->balanceFactor = new int(0);
    std::cout << "Creating the AVL node " << *(this->value) << " with balance factor " << *(this->balanceFactor) << "\n";
}

Теперь моя проблема заключается в том, что я должен получить NodeAVL (обязательно), и у меня есть проблема с классом Node (базовый класс), потому что есть объявления Node *leftChild и Node *rightChild, и когда я создаю узел AVL, он создает его дочерние элементы типа Node*. Как я могу создать его с типом NodeAVL*? Или как создать класс T, например:

class T{
    T* leftChild;
    T* rightChild;
}

, чтобы у класса Node было Node потомков, а NodeAVL, производного от Node, - NodeAVL потомков?

1 Ответ

0 голосов
/ 31 марта 2020

Поскольку вы пометили свой пост полиморфизмом, я дам вам ответ на основе полиморфизма во время выполнения. Вы этого не делаете.

Частью полиморфизма времени выполнения является то, что объект, полученный из базового класса, может быть передан и сохранен как как объект базового класса. класс, сохраняя при этом его переопределенную функциональность (да, нарезка является проблемой, но мы имеем дело с указателями здесь). Поэтому вам не нужно менять Node на NodeAVL, достаточно просто установить leftChild или rightChild для указания на объект NodeAVL вместо Node, любые переопределенные методы будут вызывать метод в NodeAVL.

В любом случае вы устанавливаете свои узлы на nullptr, но если вы этого не сделаете, вы можете создать Node конструктор, который принимает указатели для leftChild и rightChild (возможно, сделайте это защищен, поэтому только производные классы могут использовать его).

В качестве дополнительного примечания используйте список инициализаторов для установки value вместо того, чтобы настраивать его впоследствии. Также предпочитайте умные указатели голым указателям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...