ti-enxame.com

As 'interfaces' do C++ devem ter um destruidor virtual

Possível Duplicar:
Destrutores para classes semelhantes à interface C++

Considere um exemplo simples de uma classe abstrata C++, usada para modelar uma interface:

class IAnimal
{
  virtual void walk()=0;
  virtual ~IAnimal(){}
};

É melhor ter o destruidor ou não? Eu não acho que o destruidor pode ser virtual puro, pelo menos meus testes dão erros de linker, então deve ser incluído um destruidor vazio?

EDIT: desculpe, erro de digitação. É um destruidor não um construtor.

40
Mr. Boy

Você deve sempre usar um destruidor virtual com interfaces. Caso em questão:

IAnimal* animal = new Lion();
delete animal;

Agora, qual destruidor ele vai usar? Definitivamente não é o destruidor do Leão porque a interface não sabe sobre o destruidor do Lion .

Então, faça isso se a sua interface não tiver gerenciamento de memória:

virtual ~IAnimal(){}
41
wheaties

Confira este artigo por Herb Sutter

Especialmente esta parte:

Apenas para o caso especial do destrutor :

Diretriz # 4: Um destruidor de classe base Deve ser público e virtual, Ou protegido e não-virtual.

Isso pressupõe que a classe base seja uma classe de 'interface' como deveria ser.

20
Chubsdad

Isso depende se você pretende gerenciar a vida útil dos objetos polimorficamente, usando ponteiros para a classe de interface.

Se você fizer isso, então o destruidor deve ser virtual, a fim de excluir corretamente os objetos. Excluir um ponteiro de classe base que não tenha um destruidor virtual é inválido e fornece um comportamento indefinido.

Se você não fizer isso, você deve impor isso tornando o destrutor não-virtual e protegido, portanto, apenas classes derivadas podem ser excluídas.

5
Mike Seymour

Eu acho que deveria ser um destruidor virtual puro para interfaces, e todos os outros métodos são virtuais puros também.

1
duffymo

um construtor vazio provavelmente deve ser incluído, pois um uso típico de uma interface envolve colocar um ponteiro em algum objeto concreto em um contêiner, o que chamaria o destruidor errado e não limparia a memória corretamente. vai apagar objetos derivados através de um ponteiro para Ianimal fazer um destruidor virtual, senão tornar seu destruidor não-virtual e protegido. tornar seu destruidor virtual puro provavelmente não é uma boa idéia, já que força implementadores de classes derivadas a sobrescrever seu destruidor, mesmo que eles não queiram fazer nada

0
flownt

A única razão para não tornar o destruidor virtual seria salvar o espaço necessário para o vptr. Como você precisa da vptr mesmo assim, porque você tem outra função virtual, eu faria o destruidor virtual.

0
gpeche