É errado escrever:
class A {
public:
virtual ~A() = 0;
};
para uma classe base abstrata?
Pelo menos isso compila no MSVC ... Ele trava no tempo de execução?
É errado escrever:
class A {
public:
virtual ~A() = 0;
};
para uma classe base abstrata?
Pelo menos isso compila no MSVC ... Ele trava no tempo de execução?
Respostas:
Sim. Você também precisa implementar o destruidor:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
deve ser suficiente.
E uma vez que houve uma votação negativa, devo esclarecer: se você extrair algo de A e tentar excluí-lo ou destruí-lo, A
o destruidor de eventualmente será chamado. Como é puro e não possui uma implementação, um comportamento indefinido se seguirá. Em uma plataforma popular, isso invocará o manipulador de chamadas e falhas.
Editar: corrigindo a declaração para ser mais compatível, compilada com http://www.comeaucomputing.com/tryitout/
Destruidores particulares: eles darão um erro quando você criar um objeto de uma classe derivada - não de outra forma. Um diagnóstico pode aparecer.
12.4 Destrutores
6 Um destruidor pode ser declarado virtual (10.3) ou virtual puro (10.4); se quaisquer objetos dessa classe ou de qualquer classe derivada forem criados no programa, o destruidor deve ser definido.
Uma classe com um destruidor virtual puro é uma classe abstrata. Observe bem:
10.4 Classes abstratas
2 Uma função virtual pura precisa ser definida apenas se for chamada com ou como (12.4), a sintaxe de identificação qualificada (5.1).
[ Nota : uma declaração de função não pode fornecer um especificador puro e uma definição - end note]
Retirado direto do rascunho:
struct C {
virtual void f() = 0 { }; // ill-formed
};