Как я могу изменить назначение полей базового класса в C ++? - PullRequest
0 голосов
/ 09 мая 2020

Я хочу создать узловой класс, который затем можно использовать для различных типов деревьев, но я сталкиваюсь с трудностями, когда пытаюсь обдумать, как это сделать, чтобы не создавать ненужные поля. Например, у меня есть следующий класс:

class Node {
protected:
    Node *left;
    Node *right;
}

Этот класс будет иметь методы, которые будут иметь дело с получением и установкой левого и правого соединений узла. Но тогда у меня также будет следующий класс:

class BinaryNode : public Node { 
protected:
    BinaryNode *left_child;
    BinaryNode *right_child;
    BinaryNode *parent;
}

Помимо нового родительского соединения, левый и правый дочерние узлы можно описать с помощью левого и правого соединений из базового класса, но я могу не используйте их, потому что они не являются двоичными узлами. Есть ли подходящий способ заставить их вести себя так, как я хочу?

Мне также пришло в голову, что это может не стоить усилий и что мне все равно следует создавать новые поля, чтобы я меня не заставляют таскать иногда неинтуитивные имена и подозрительный кастинг. Я был бы рад узнать об этой мысли.

1 Ответ

5 голосов
/ 09 мая 2020

При предлагаемой иерархии классов BinaryNode будет иметь четырех дочерних элементов. Левый и правый общие c узлы из базового, а левый и правый двоичные узлы как прямые члены.

Если вам не нужен динамический c полиморфизм, шаблон будет подходящим способом для повторного использования кода узла. Это типичный вариант использования шаблона "Любопытно повторяющийся шаблон":

template<class Child>
class Node {
protected:
    Child *left;
    Child *right;
};

class BinaryNode : protected Node<BinaryNode> { 
protected:
    BinaryNode *parent;
};
...