You're missing one piece of the puzzle

from Steve Heller (stheller@koyote.com)
You're missing one function, namely UndatedStockItem::Reorder, which is what will be called by the StockItem::Reorder function, because the member variable pointed to by the m_Worker pointer in a DatedStockItem object is an UndatedStockItem. The UndatedStockItem Reorder function does NOT call StockItem::Reorder, so an infinite regress is avoided.