在父指针上调用虚函数

时间:2018-03-21 14:07:30

标签: c++ polymorphism

我有一个树结构,是从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中被覆盖的方法永远不会被调用。

1 个答案:

答案 0 :(得分:0)

我只是尝试了这个并且多态性 - 它在我的最终工作。 这是我运行的代码:

$select_order = "SELECT ORDER_NO, DELI_NO, INV_NO, DELI_DT, AMOUNT FROM ORDER WHERE ORDER_NO = '$text_input_order'";
$exec_order = odbc_exec($connSQL, $select_order);
while(odbc_fetch_row($exec_order))
{
   $get_order_no = odbc_result($exec_order, "ORDER_NO");
   $get_deli_no  = odbc_result($exec_order, "DELI_NO");
   $get_inv_no  = odbc_result($exec_order, "INV_NO");
   $get_deli_dt  = odbc_result($exec_order, "DELI_DT");
   $get_amount   = odbc_result($exec_order, "AMOUNT");
  ?>
  <tr>
     <td><? echo $get_order_no;?></td>
     <td><? echo $get_deli_no  ;?></td>
     <td><? echo $get_inv_no  ;?></td>
     <td><? echo $get_deli_dt  ;?></td>
     <td><? echo $get_amount   ;?></td>
     <td><input type="submit" value="proces" name="proces"></td>
  </tr>
  <?
}

这是

的输出
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;
}

正如所料。

因此,调用B的方法。

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