Inyección de dependencia de C ++: ¿plantillas o métodos virtuales?

Me pregunto cuál es la forma en C ++ de usar la inyección de dependencia. ¿Está usando plantillas o clases polimórficas? Considere el siguiente código,

class AbstractReader
{
public:
  virtual void Read() = 0;
};

class XMLReader : public AbstractReader
{
public:
  void Read()  { std::cout << "Reading with a XML reader" << std::endl; }
};

class TextFileReader : public AbstractReader
{
public:
  void Read()  { std::cout << "Reading with a Text file reader" << std::endl; }
};

class Parser
{
public:
  Parser(AbstractReader* p_reader) : reader(p_reader) { }
  void StartParsing() { reader->Read();
    // other parsing logic
  }
private:
  AbstractReader* reader;
};

template<class T>
class GenericParser
{
public:
  GenericParser(T* p_reader) : reader(p_reader) { }

  void StartParsing()
  {
    reader->Read();
  }
private:
  T* reader;
};

1 - ¿Cuál es el mejor método? @ GenericParser o Analizador? Sé si es GenericParser, la herencia se puede eliminar.

2 - Si las plantillas son el camino a seguir, ¿está bien escribir todo el código en los archivos de encabezado? He visto muchas clases usando plantillas que escriben todo el código en archivos de encabezado en lugar de la combinación .h / .cpp. ¿Hay algún problema al hacerlo, algo como la alineación, etc.?

¿Alguna idea

Respuestas a la pregunta(8)

Su respuesta a la pregunta