Você já definiu o ponto importante - o tempo de execução e o outro tempo de compilação . A informação real que você precisa é das ramificações desta escolha.
Compiletime:
- Pro: As interfaces de tempo de compilação são muito mais granulares do que as de tempo de execução. Com isso, o que quero dizer é que você pode usar apenas os requisitos de uma única função, ou um conjunto de funções, como você as chama. Você não precisa sempre fazer toda a interface. Os requisitos são apenas e exatamente o que você precisa.
- Pro: Técnicas como CRTP significam que você pode usar interfaces implícitas para implementações padrão de coisas como operadores. Você nunca poderia fazer uma coisa dessas com herança em tempo de execução.
- Pro: interfaces implícitas são muito mais fáceis de compor e multiplicar "herdar" do que interfaces de tempo de execução e não impõem nenhum tipo de restrição binária - por exemplo, classes POD podem usar interfaces implícitas . Não há necessidade de
virtual
herança ou outros truques com interfaces implícitas - uma grande vantagem. - Pro: O compilador pode fazer muito mais otimizações para interfaces em tempo de compilação. Além disso, o tipo extra de segurança contribui para um código mais seguro.
- Pro: é impossível fazer um tipo de valor para interfaces de tempo de execução, porque você não sabe o tamanho ou o alinhamento do objeto final. Isso significa que qualquer caso que precise / se beneficia da digitação de valores ganha grandes benefícios com os modelos.
- Con: Modelos são uma puta para compilar e usar, e eles podem ser portais fiddly entre compiladores
- Con: Modelos não podem ser carregados em tempo de execução (obviamente), então eles têm limites em expressar estruturas de dados dinâmicas, por exemplo.
Tempo de execução:
- Pro: O tipo final não precisa ser decidido até o tempo de execução. Isso significa que a herança em tempo de execução pode expressar algumas estruturas de dados muito mais fáceis, se os modelos puderem fazer isso. Além disso, você pode exportar tipos polimórficos em tempo de execução através de limites C, por exemplo, COM.
- Pro: É muito mais fácil especificar e implementar a herança em tempo de execução e você não obterá nenhum comportamento específico do compilador.
- Con: A herança em tempo de execução pode ser mais lenta que o inheritane em tempo de compilação.
- Con: a herança em tempo de execução perde informações de tipo.
- Con: a herança em tempo de execução é muito menos flexível.
- Con: Herança múltipla é uma cadela.
Dada a lista relativa, se você não precisa de uma vantagem específica da herança em tempo de execução, não a use. É mais lento, menos flexível e menos seguro que os modelos.
Edit: Vale a pena notar que em C ++ particularmente há usos para herança outros do que o polimorfismo em tempo de execução. Por exemplo, você pode herdar typedefs, ou usá-lo para tagging de tipo, ou usar o CRTP. Em última análise, porém, essas técnicas (e outras) realmente se enquadram em "Compile-time", mesmo que sejam implementadas usando class X : public Y
.