Предположим, у меня есть абстрактный базовый класс с именем Node
.
class Node
{
public:
Node() {
leftChild = NULL;
rightChild = NULL;
};
Node * leftChild, *rightChild;
void attach(Node * LC, Node * RC) {
leftChild = LC;
rightChild = RC;
};
};
У меня также есть несколько функций (из которых я буду включать две для простоты, но на самом деле это может быть любое число).
float add(float a, float b){return a+b;}
bool gt(float a, float b){return a>b;}
Для каждой функции есть связанный класс. Первый выглядит следующим образом.
class BinaryFunction1 : public Node
{
public:
BinaryFunction1() {
};
float(*)(float, float) addition(){
return add
};
}
Второй ниже.
class BinaryFunction2 : public Node
{
public:
BinaryFunction2() {
};
bool(*)(float, float) greaterthan(){
return gt
};
}
В основном я хотел бы выполнить что-то подобное нижеприведенному как способ создания связанного списка в надежде построить абстрактное синтаксическое дерево.
BinaryFunction1 testBinaryFunction1();
BinaryFunction2 testBinaryFunction2();
testBinaryFunction1.attach(&testBinaryFunction2, &testBinaryFunction2);
dynamic_cast<BinaryFunction2 *>(testBinaryFunction1.leftChild)->greaterthan()(2.0, 4.0)
dynamic_cast
действительно ужасен, и я вижу, что он споткнул меня еще дальше по дороге. Есть ли способ избежать этого и полностью избавиться от него.
Насколько я понимаю, Node * leftChild, * rightChild
действительно является проблемой, поскольку я считаю, что именно здесь происходит неявное понижение рейтинга. Я не уверен, как объявить эти указатели, если я не знаю, какими будут их типы во время компиляции.