Запутался. С одной стороны, узлы делятся на значения и выражения (которые, в свою очередь, могут содержать другие узлы, являющиеся значениями или выражениями). С другой стороны, выражения и значения делятся по типу возвращаемого значения (логические, числовые, строковые). Соотвественно, не все узлы могут быть дочерними узлами для других узлов. Например, для операции сложения нельзя использовать одновременно строку и число (но можно складывать строку со строкой или число с числом). Какой должна быть иерархия классов, позволяющая на этапе компиляции проверить хотя бы частично, что родительский узел содержит узлы правильных типов? Можно ли обойтись без множественного наследования?