14

I think virtual alone is generally sufficient.

Is there another reason to make it pure virtual than to force derived classes to implement their own destructor? I mean if you allocate something in your class' constructor you should impement your own destructor - if your class is derived or not.

Doesn't count as answer as I already know: If you want your class abstract and it has no pure virtual functions - leave it to the destructor.

Some more uses?

spc-mrn
  • 257
  • 1
  • 3
  • 11
  • 4
    Note that the compiler automatically generates a destructor in the derived class if there is none provided explicitly. This automatically generated destructor is enough, you are not forced to write a destructor yourself, even if the one in the base class is pure. – sth Aug 17 '10 at 14:01
  • So even the first reason is actually none. Great comment! – spc-mrn Aug 17 '10 at 14:05
  • Just a side note: another function which must be virtual is (when exists) the operator=. Same reason as the dtor. – rkellerm Aug 17 '10 at 14:21
  • 1
    @rursw1: `operator=()` is useful for classes with value semantics, but not for polymorphic classes. – sbi Aug 17 '10 at 14:35

4 Answers4

11

No. If the base class allocates anything, it is it's responsiblity to release it.

Further, if the derived class does not allocte anything, there's no point in forcing them to write a dummy dtor.

James Curran
  • 101,701
  • 37
  • 181
  • 258
11

If you want your class abstract and it has no pure virtual functions - leave it to the destructor.

Actually, I don't think there's more. All the pure virtual destructor does, is make the whole class abstract. You have to provide the implementation for the pure virtual destructor as well as for a non-pure virtual destructor, the destructors of the derived classes are virtual with virtual destructor alone, etc.

Basically, if a class has already some pure virtual functions, its behaviour would be equivalent with virtual and pure-virtual destructor.

jpalecek
  • 47,058
  • 7
  • 102
  • 144
1

Ideally the language should have a way to assure (implicitly or not) that the destructor is virtual in abstract classes without having to define it or make it pure. But it hasn't.

So the choice is: either make it pure, and have the burden of defining it in each derived class, or make it not, and have the burden of defining it in the abstract class. The later is less work, and also shorter code, so I'd go for it.

Fabio Ceconello
  • 15,819
  • 5
  • 38
  • 51
  • Shorter code because the pure virtual dtor has to be implemented outside the class. The first argument against pure virtual! Thanks – spc-mrn Aug 17 '10 at 14:11
  • 1
    Actually, I don't thing the code would get shorter. Compare `~Klass() =0` + its implementation and `~Klass() {}`. – jpalecek Aug 17 '10 at 14:19
  • 1
    "+ its implementation" is the point as it cannot be inline, i.e. Klass::~Klass(){} – spc-mrn Aug 17 '10 at 14:42
  • @jpalacek, what I meant is that if the destructor is not pure in the abstract class, you don't have to define it in each derived class. So you don't have the extra destructor in the call chain. Also it's less clutter in the derived classes. – Fabio Ceconello Aug 17 '10 at 16:32
  • 1
    @Fabio: even if it's pure in the base class, you don't have to define it in each derived class. The implicit destructor is good enough. – Mike Seymour Aug 17 '10 at 16:55
-2

If your abstract class is a pure interface, with no data members than you could get along with making the dtor pure virtual. I prefer that myself, since I've seen so many hot-shot programmers forget to make a virtual destructor at all: Even when they write derived classes containing virtual methods. So I would do it purely to minimize maintenance headaches down the road.

C.J.
  • 15,637
  • 9
  • 61
  • 77
  • 2
    Forgetting to write destructors is a risk in any class, not just derived classes! The biggest problem here is forgetting to write a virtual destructor in the *base* class. – Oliver Charlesworth Aug 17 '10 at 14:11
  • I'm not sure why there was a down vote? since there was no comments as to why. So that isn't very helpful - if I'm missing something. Or If I didn't articulate myself very well (Which I see i could have used a proof-reader this morning). – C.J. Aug 18 '10 at 02:16