【问题标题】:How do I store a pointer to a derived class in an instance variable declared as a pointer to a base class?如何将指向派生类的指针存储在声明为基类指针的实例变量中?
【发布时间】: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

标签: c++ abstract-syntax-tree


【解决方案1】:

这里不需要进行动态转换。 您可以使用:

static_cast<const ValNode*>(node->getLeft())->getValue()

【讨论】:

  • 当我这样做时,我会得到未定义的行为。
  • 请澄清“未定义的行为”是什么意思。
  • 与输入明显无关的随机数
  • 这暗示您的构造函数之一可能无法正常工作。请提供 ValNode 和 ASTNode 的构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多