最近,我不得不为一个研究项目实现一个抽象查询树。基对象是ASTNode
,但实际的树节点是派生类:表达式节点、比较节点、操作数节点等。每种类型的节点都有自己的成员,例如操作数节点、参数列表等.
递归生成这棵树的解析函数需要返回ASTNode
类型,因为它们只返回一个指针,而不管生成树的根部是什么类型的节点。
这意味着解析树的函数需要查询,对于树中的每个节点,它是什么类型,然后再对其进行操作。这可以通过动态强制转换或 typeid 来完成,但是 SO 和 Google 风格指南会因为我违反Liskov 替换原则和所有运行类型检查而生气。
我不能将对节点进行操作的函数放在节点子类本身中,因为树可以在应用程序的不同部分以几种不同的方式使用。有没有更好的方法来构建我的树?