最近、私は研究プロジェクトのために抽象クエリツリーを実装する必要がありました。基本オブジェクトはですASTNode
が、実際のツリーノードは派生クラスでした:式ノード、比較ノード、オペランドノードなど。各タイプのノードには、オペランドノード、引数のリストなどの独自のメンバーがあります。 。
このツリーを再帰的に生成する解析関数ASTNode
は、生成されたツリーのルートにあるノードのタイプに関係なく、ポインターを返すだけなので、タイプを返す必要があります。
つまり、ツリーを解析する関数は、ツリーを操作する前に、ツリー内のノードごとに、そのタイプを照会する必要があります。これは動的キャストまたはtypeidを使用して実行できますが、SOおよびGoogleスタイルガイドラインは、リスコフの置換原則および一般的なすべての実行タイプタイプチェックの違反に腹を立てます。
ツリーはアプリケーションのさまざまな部分でさまざまな方法で使用できるため、ノードを操作する関数をノードサブクラス自体に配置することはできません。私の木を構造化するためのより良い方法はありますか?