【问题标题】:Calling virtual function on parent pointer在父指针上调用虚函数
【发布时间】:2018-03-21 14:07:29
【问题描述】:

我有一个树结构,它是从Node 的派生类创建的。每个Node 都有指向它的父级的指针和一个虚函数Symbols()。这是一个简化的例子:

struct Node {
    Node* parent;
    virtual const SymbolTable& Symbols() { return parent->Symbols(); }
}

struct A : public Node {
}

struct B : public Node {
    SymbolTable symbols;
    const SymbolTable& Symbols() override { return symbols; }
}

所以在这个树形结构中,A 节点没有 SymbolTableB 节点。我需要做的就是让Symbols() 方法首先返回当前节点上方的SymbolTable,但似乎B 中被覆盖的方法永远不会被调用。

【问题讨论】:

  • 现在如果你有 A 节点,这将结束。
  • 好吧,我正在尝试整理一些最小的工作示例,但到目前为止,它的工作原理与我期望它在我的完整程序中工作一样。
  • @MarošBeťko 那么您可能正在对部分破坏的实例调用此函数,例如来自析构函数。
  • 别忘了添加虚拟析构函数

标签: c++ polymorphism


【解决方案1】:

我刚刚尝试过这个,多态性对我来说是有效的。 这是我运行的代码:

struct SymbolTable {
    int sym = 42;
};

struct Node {
    Node* parent{ nullptr };
    virtual const SymbolTable& Symbols() { return parent->Symbols(); }
};

struct A : public Node {
};

struct B : public Node {
    SymbolTable symbols;
    const SymbolTable& Symbols() override { return symbols; }
};

int main()
{
    B parent;
    A child;
    child.parent = &parent;

    std::cout << child.Symbols().sym << std::endl;

    return 0;
}

这个输出是

42

正如预期的那样。

因此调用了B的方法。

但是,请注意,如果您的 A 类型节点没有父节点,则程序将崩溃,因为访问了无效指针(在本例中我将其初始化为 nullptr,您也应该这样做)。在此示例中,这意味着将 parent 的类型更改为 A。在这种情况下,程序将因访问冲突而崩溃(因为 parent 的父级是空指针) .

【讨论】:

  • “程序将因访问冲突而崩溃” - 如果你很幸运,这只是普通的未定义行为
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多