Foi adicionado o suporte dos modificadores final e override para classes, estruturas e funções.
Modificador final para classes e estruturas
A presença do modificador final, ao declarar a estrutura ou classe,
restringe a futura herança a partir dele. Se a classe (estrutura) não
precisar de alterações futuras ou se essas alterações não estiverem
disponíveis por razões de segurança, será bom que a declare com o
modificador final. Quando você fizer isso, todos os métodos da classe
também serão implicitamente considerados como final.
class CFoo final
{
};
class CBar : public CFoo
{
};
Ao tentar herdar a partir da classe com o modificador final, como
foi mostrado no exemplo acima, o compilador exibirá o erro:
cannot inherit from 'CFoo' as it has been declared as 'final'
see declaration of 'CFoo'
Modificador override para a função
O modificador
override indica que a função declarada deve substituir o método da
classe pai. Durante a substituição, o uso deste modificador permite
evitar erros como, por exemplo, a alteração aleatória de assinatura.
Outro exemplo mais detalhado seria, na classe básica, está definido o
método func, ele aceita como argumento a variável do tipo int:
class CFoo
{
void virtual func(int x) const { }
};
Além disso, o método é substituído na classe herdada:
class CBar : public CFoo
{
void func(short x) { }
};
No entanto, de acordo com o erro, o tipo de argumento é alterado
de int para short. De fato, neste caso, não acontece uma substituição,
senão uma sobrecarga do método. Após agir segundo o algoritmo para determinar a função sobrecarregada, em determinadas situações, o compilador pode selecionar o método definido na classe base, em vez do método substituído.
Para evitar esses erro, é preciso adicionar explicitamente o modificador override ao método override.
class CBar : public CFoo
{
void func(short x) override { }
};
Se, durante a substituição, for alterada a assinatura do método, o
compilador não poderá encontrar, na classe pai, o método com exatamente
a mesma assinatura e exibirá o erro de compilação:
'CBar::func' method is declared with 'override' specifier but does not override any base class method
Modificador final para a função
Ao contrário, o
modificador final restringe a substituição de método nas
classes-herdeiras. Se a realização do método for auto-suficiente é
estiver totalmente concluída, declare-o com o modificador final, para
que ele não seja modificado posteriormente.
class CFoo
{
void virtual func(int x) final { }
};
class CBar : public CFoo
{
void func(int) { }
};
Ao tentar substituir o método com o modificador final, como foi mostrado no exemplo acima, o compilador exibirá o erro:
'CFoo::func' method declared as 'final' cannot be overridden by 'CBar::func'
see declaration of 'CFoo::func'