O padrão é tornar as classes `finais 'ou dar a elas um destruidor virtual?

Classes com destruidores não virtuais são uma fonte de erros se forem usadas como classe base (se um ponteiro ou referência à classe base for usado para se referir a uma instância de uma classe filha).

Com a adição do C ++ 11 de umfinal estou pensando se faz sentido definir a seguinte regra:

Toda classe deve preencher uma dessas duas propriedades:

ser marcadofinal (se ainda não tiver a intenção de ser herdada)ter um destruidor virtual (se é (ou se destina a) ser herdado de)

Provavelmente, existem casos em que nenhuma dessas duas opções faz sentido, mas acho que elas podem ser tratadas como exceções que devem ser cuidadosamente documentadas.