You're missing one piece of the puzzle

from Steve Heller (
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.