I feel like implementing these at the top level as follows might be easier...?

    notifyNewHashChunk(chunk) {
      throw std::runtime_error(typeid(*this).name() + " unexpectedly received a hash chunk."
    }

That way you save people from re-implementing it all the time.