HuffNode<E>* Root 指向 LeafNode 或 IntlNode 實例,但通過 Root 調用子類特有方法(如 left()、val())編譯報錯「成員函數未定義」。
Root 靜態類型為 HuffNode<E>*(基類指針),**編譯期只能看到基類接口**。子類特有方法不在基類虛函數表中。
在基類聲明純虛函數,子類實現:
template <typename E>
class HuffNode {
public:
virtual ~HuffNode() {}
virtual int weight() = 0;
virtual bool isLeaf() = 0;
// 新增通用訪問接口
virtual HuffNode<E>* left() { return nullptr; }
virtual HuffNode<E>* right() { return nullptr; }
virtual E val() { throw std::runtime_error("Not leaf"); }
};
template <typename E>
class LeafNode : public HuffNode<E> {
// 實現 val()
E val() override { return it; }
// left/right 保持基類默認實現
};
template <typename E>
class IntlNode : public HuffNode<E> {
// 實現 left/right
HuffNode<E>* left() override { return lc; }
HuffNode<E>* right() override { return rc; }
};
調用時:Root->left() 多態派發到 IntlNode::left()。
if (auto* internal = dynamic_cast<IntlNode<E>*>(Root)) {
internal->left(); // 安全調用子類方法
}
需基類有虛函數(已有虛析構函數即可),且開啟 RTTI。
dynamic_cast,違反開閉原則。Visitor 模式雙分發。