471,585 Members | 1,270 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,585 software developers and data experts.

do I need a virtual destrucotr?

Hi all, I have some class hierarchy as follows:

class S {};
class A {};
class B {public: vector<S*> v_; virtual ~B();};

class C : public virtual A, public virtual B { // do I need to define
virtual ~C() so that B can be properly destructed?};

in fact, I don't even know if a destructor in C is even needed if I don't do
any memory allocation? Thanks in advance.

jj.
Jul 19 '05 #1
2 1858
Okay, so for clarification purposes, suppose I have the following:
base (pure virtual)
^
|
|
poly derived1
^
|
|
derived2

and base, derived1, derived2 do not contain anything that needs to be
specially allocated, deallocated. Then I do something like:

base* p = new derived2;

then I do:
delete p;

then only base's destructor will be called... correct? But that's okay,
since stuff inside derived1 and derived2 (such as vector<>, list<>, etc)
should take care of themselves? Or is it necessary to define the destructor
explicitly, and call
vector<>.clear() for vectors, lists... etc? It seems extrememly tedious to
go throught the inheritance hierarchy and clearing objects that shouldn't
have to be cleared. Any suggestions? Maybe I'm just confusing myself.

jj

"Rolf Magnus" <ra******@t-online.de> wrote in message
news:bh*************@news.t-online.com...
Jimmy Johns wrote:
Hi all, I have some class hierarchy as follows:

class S {};
class A {};
class B {public: vector<S*> v_; virtual ~B();};

class C : public virtual A, public virtual B { // do I need to define
virtual ~C() so that B can be properly destructed?};


That depends. If it's possible that you destroy a C through a pointer to
one of its base classes, you need a virtual destructor, but you will
need that in the base class.
in fact, I don't even know if a destructor in C is even needed if I
don't do any memory allocation?


If you don't need a destructor, don't define one, except if you're in a
base class that is supposed to be used polymorphically, becase then
there is a chance that a derived object is deleted through a pointer to
base, so you'll need a virtual destructor in that base.

Jul 19 '05 #2
Jimmy Johns wrote:
Okay, so for clarification purposes, suppose I have the following:
base (pure virtual)
What is pure virtual? The destructor?
^
|
|
poly derived1
^
|
|
derived2

and base, derived1, derived2 do not contain anything that needs to be
specially allocated, deallocated. Then I do something like:

base* p = new derived2;

then I do:
delete p;

then only base's destructor will be called... correct?
If you mean above that base's destructor is virtual, then no. derived2's
destructor will be called. If OTOH, base's destructor is not virtual,
then you are correct.
But that's okay, since stuff inside derived1 and derived2 (such as
vector<>, list<>, etc) should take care of themselves?
What do you mean by "take care of themselves"? Their destructors must be
called by someone. If derived2's destructor is called, the destructors
of its member variables are called too.
Or is it necessary to define the destructor explicitly, and call
vector<>.clear() for vectors, lists... etc?
Their destructors will do that when (and if) they are destroyed
properly.
It seems extrememly tedious to go throught the inheritance hierarchy
and clearing objects that shouldn't have to be cleared. Any
suggestions? Maybe I'm just confusing myself.


I guess you are. It's actually rather simple: If there is a chance (even
if very low) that an instance of derived1 or derived2 is deleted
through a pointer to base, base's destructor must be virtual. Then the
correct destructor is automagically called.

Jul 19 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Carl Bevil | last post: by
8 posts views Thread by JustSomeGuy | last post: by
2 posts views Thread by Bonj | last post: by
8 posts views Thread by rakoo | last post: by
10 posts views Thread by David Thielen | last post: by
4 posts views Thread by Neo | last post: by
reply views Thread by XIAOLAOHU | last post: by
reply views Thread by leo001 | last post: by
reply views Thread by Anwar ali | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.