do I need a virtual destrucotr?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jimmy Johns

    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.


  • Jimmy Johns

    #2
    Re: do I need a virtual destrucotr?

    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" <ramagnus@t-online.de> wrote in message
    news:bhnlke$lch $06$3@news.t-online.com...[color=blue]
    > Jimmy Johns wrote:
    >[color=green]
    > > 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?};[/color]
    >
    > 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.
    >[color=green]
    > > in fact, I don't even know if a destructor in C is even needed if I
    > > don't do any memory allocation?[/color]
    >
    > 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.
    >[/color]


    Comment

    • Rolf Magnus

      #3
      Re: do I need a virtual destrucotr?

      Jimmy Johns wrote:
      [color=blue]
      > Okay, so for clarification purposes, suppose I have the following:
      > base (pure virtual)[/color]

      What is pure virtual? The destructor?
      [color=blue]
      > ^
      > |
      > |
      > 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?[/color]

      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.
      [color=blue]
      > But that's okay, since stuff inside derived1 and derived2 (such as
      > vector<>, list<>, etc) should take care of themselves?[/color]

      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.
      [color=blue]
      > Or is it necessary to define the destructor explicitly, and call
      > vector<>.clear( ) for vectors, lists... etc?[/color]

      Their destructors will do that when (and if) they are destroyed
      properly.
      [color=blue]
      > 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.[/color]

      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.

      Comment

      Working...