473,507 Members | 12,744 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

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 1948
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
2201
by: Carl Bevil | last post by:
I'm creating a library for internal use that relies on third-party code. I don't want clients of this library to know anything about the third party code, when compiling or running. Generally...
8
2827
by: JustSomeGuy | last post by:
I need to write an new class derived from the list class. This class stores data in the list to the disk if an object that is added to the list is over 1K in size. What methods of the std stl...
2
1762
by: Bonj | last post by:
Hello Can anyone assist with the following class hierarcy problem? I have a series of window classes, the object model currently being as such: Window / | \ / | \...
10
2247
by: mark | last post by:
I have this class: class Selections { OSStatus Init(); protected: CFMutableSetRef selectionObjects; static void CFASelectionsApplier(const void* value, void* ctx); OSType ready; public:...
8
2879
by: rakoo | last post by:
I want to question about this virtual keyword , what is neccessty of it .. when base class ponter or simply object assingned to derived class object ,we never want that base class funtion by base...
10
2265
by: David Thielen | last post by:
Hi; I have help html pages for each page of my ASP.NET webapp. So for the page datasource.aspx, I have help\datasource.htm. Bu what I want when the hyperlink is clicked, for it to look for the...
4
278
by: Neo | last post by:
I have the following code structure- class A { public: virtual void foo_a()=0; }; class B { public: virtual void foo_b()=0; };
3
1563
by: a | last post by:
Hi, I need clarification for virtual method and pure virtual method. e.g Class Base{ virtual void func(){ ---- } } Class Child : public Base{ void func()
0
1791
by: akshaycjoshi | last post by:
I am reading a book which says Even though unboxed value types don't have a type object pointer, you can still call virtual methods (such as Equals, GetHashCode, or ToString) inherited or...
0
7221
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7109
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7313
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
1
7029
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
7481
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
5619
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
3190
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
3179
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
758
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

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.