У меня есть класс, который является узлом дерева, называемым узлом. Мне нужно создать тип класса DerivedNode, который имеет некоторые дополнительные функции. Проблема в том, что Node имеет вектор Node * в качестве переменной-члена, поэтому, когда DerivedNode наследуется от Node, он наследует этот вектор. Я создал простой пример, показывающий вопрос:Удалить dynamic_cast в производном классе узла дерева
#include <iostream>
#include <vector>
class Node {
public:
Node(int value_) : value(value_) {}
int foo() { return value; }
virtual void add(Node* new_node) {
children.push_back(new_node);
}
protected:
std::vector<Node*> children;
int value;
};
class DerivedNode : public Node {
public:
DerivedNode(int value_) : Node(value_) {}
int bar() { return value*2; }
// Ensures we only add children of type DynamicNode*
virtual void add(DerivedNode* new_node) {
children.push_back(new_node);
}
void print() {
for (size_t i = 0; i < children.size(); ++i) {
std::cout << dynamic_cast<DerivedNode*>(children[i])->bar() << std::endl;
}
}
};
int main() {
DerivedNode* child_a = new DerivedNode(5);
DerivedNode* child_b = new DerivedNode(6);
DerivedNode parent(1);
parent.add(child_a);
parent.add(child_b);
parent.print();
delete child_a;
delete child_b;
}
Мой вопрос, как я могу сделать это без dynamic_cast
? Мой фактический код намного сложнее, что означает, что во всем мире есть динамические броски.
Я думаю, что дети DerivedNode должны находиться в 'std :: vector', особенно если вы знаете, что он будет содержать только 'DerviedNode *'. –
tforgione
Добавить виртуальную функцию-член 'bar()' в базовый класс? – songyuanyao
@DragonRock Я пробовал это, он создает много проблем намного хуже, чем dynamic_cast. Проблема в том, что есть два ребенка, поэтому методы в узле будут вызывать вектор, а методы в DerivedNode будут вызывать вектор version –
texasflood