我有一个树结构,是从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
个节点没有SymbolTable
和B
个节点。我需要做的就是Symbols()
方法首先返回当前节点上方SymbolTable
,但似乎B中被覆盖的方法永远不会被调用。
答案 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 的父项是空指针)