【发布时间】:2018-02-13 20:55:23
【问题描述】:
我正在尝试用 C++ 编写一个玩具语言解释器。我在 AST 课程上遇到了麻烦。父类ASTNode 将其左分支和右分支指针声明为ASTNode*,如下所示:
class ASTNode {
public:
ASTNode(NodeType newType, const ASTNode* left, const ASTNode* right);
const ASTNode* getLeft() const;
const ASTNode* getRight() const;
protected:
//node type omitted
ASTNode* left;
ASTNode* right;
}
ASTNode 类有一个名为 ValNode 的子类。它有一个返回其值的方法(存储在成员变量中):
class ValNode : public ASTNode
{
public:
explicit ValNode(const Variant& newvalue);
const Variant& getValue() const;
private:
Variant value;
}
当我执行以下代码时,由于dynamic_cast 失败,程序崩溃了。出了什么问题,我该如何解决?
ASTNode* node = new ASTNode(NodeType::OP, new ValNode(1), new ValNode(2));
cout << dynamic_cast<const ValNode*>(node->getLeft())->getValue() << endl;
【问题讨论】:
-
能否请您发布类的定义?
-
我假设左侧和右侧没有在 ctor 中分配。否则,您可能会从编译器中收到“赋值丢弃限定符”(const)错误。
-
不要使用 dynamic_cast。你认为你需要dynamic_cast吗?这意味着您的设计在其核心被破坏(或不存在)。我无法修复您的设计,但总的来说,您应该避免抽象类中的数据成员,避免从具体类派生,并在虚函数中完成所有多态工作。
-
@cli_hlt 构造函数参数被深度复制到构造函数中。
-
@Techgineer 好吧,我们无法从您不充分的代码示例中看出。例如,你是如何填充那棵树的?请张贴minimal reproducible example。