RE: [ROOT] Multiple inheritance

From: Philippe Canal (pcanal@fnal.gov)
Date: Mon Feb 09 2004 - 18:46:54 MET


Hi Troy,

Which version of ROOT are you using, newer version (3.10/02 and 4.00) should
not have this problem.

On a different note, it is not recommended to inherit from an stl container.
STL containers do not have a virtual destructor (or any other virtual
function).
And using inheritance could lead to some trouble for example the following
code would lead to a memory leak:

	MyClass *m = new MyClass;
	vector<SmartPtr<SomeType> > * v = m;
	delete v; // call ONLY ~vector and NOT ~MyClass nor ~TObject

However, if you are aware of this limitation (no virtual table for stl
container) and if you are careful, you can get it to work.

Cheers,
Philippe.

-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Troy D. Straszheim
Sent: Monday, February 09, 2004 7:50 AM
To: roottalk@pcroot.cern.ch
Subject: [ROOT] Multiple inheritance



Hi roottalk-

I have another one:

I have a smart pointer class (a simple one) and I would like to
multiply inherit a class from TObject and a vector of smart pointers to
objects.

So the smart pointer looks like this, very basic:
template <class T> class SmartPtr<T>;

and my class would look like this:

class MyClass : public vector<SmartPtr<SomeType> >, public TObject { ... };

I find that this gets through rootcint and compiles:

class MyClass : public vector<SomeType>, public TObject { ... };

But the first does not compile, with the following error:

RootDict.cxx:462: no matching function for call to `TBuffer::StreamObject(
   __gnu_cxx::__normal_iterator<SmartPtr<SomeType>*,
std::vector<SmartPtr<SomeType>,
   std::allocator<SmartPtr<SomeType> > > >&, const std::type_info&)'
/usr/local/root/include/TBuffer.h:199: candidates are: void
   TBuffer::StreamObject(void*, const std::type_info&)
/usr/local/root/include/TBuffer.h:200:                 void
   TBuffer::StreamObject(void*, const char*)
/usr/local/root/include/TBuffer.h:201:                 void
   TBuffer::StreamObject(void*, TClass*)

Any ideas?

Thanks,

Troy Straszheim



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:05 MET