Re: cint and multiple inheritance

Rene Brun (Rene.Brun@cern.ch)
Mon, 12 Oct 1998 11:47:44 +0200


Hi Paolo,
Your program will work if you invert the order of inheritance from

class RChannel : public channel, public TObject {
to
class RChannel : public TObject, public channel {

In principle, the order should not matter. We will investigate.
Thanks for reporting.

Rene Brun

Paolo Calafiura wrote:
>
> Hi Rooters,
> I am helping to interface root to a calibration module in order to
> monitor and to analyze constants while they are taken.
> The constants of each subdetector are structured in memory as STL
> vectors of channels, which are very simple classes like:
> vector<channel*> cs(2000);
>
> class channel {
> public:
> channel() {};
> ... usual stuff ...
>
> private:
> float _slope;
> float _error;
> }
>
> I would like to be able to "decorate" channel with TObject functionality
> to make it browsable, streamable etc, but I don't want to have channel
> to inherit directly from TObject (BTW I don't think this would help
> because, I understand, cint does not like STL vectors).
>
> So I decided to make a memory copy of my vector into a TClonesArray of a
> TObject-derived RChannel. The point is that, as I have many kinds of
> "channel" classes, I don't want to re-write by hand each "RChannel"
> class with all of its member data and functions. It seemed to me a
> perfect case to use multiple inheritance:
>
> TClonesArray *tcs = new TClonesArray("RChannel", cs.size());
>
> class RChannel : public channel, public TObject {
> public:
> RChannel(){}
> RChannel(const RChannel &c):channel(c),TObject(c) {}
> RChannel(const channel &c):channel(c),TObject() {}
> ClassDef(RChannel,1)
> };
>
> and this indeed works fine as long as I access channel data in RChannel
> from my program. So, I thought, I can now write out data to a root
> file...
>
> Unfortunately the root file turns out to be empty because rootcint just
> ignores the fact that RChannel is a channel and considers it as an empty
> TObject!
> There is no mention to the TChannel inherited data members (slope and
> error)
> anywhere in the rootcint-generated TChannelCint.cc/.h. In particular
>
> void RChannel::Streamer(TBuffer &R__b)
> {
> // Stream an object of class RChannel.
>
> if (R__b.IsReading()) {
> Version_t R__v = R__b.ReadVersion(); if (R__v) { }
> TObject::Streamer(R__b);
> } else {
> R__b.WriteVersion(RChannel::IsA());
> TObject::Streamer(R__b);
> }
> }
>
> Is this a bug of rootcint or is it expected? And if so, can anybody
> suggest me another way to "decorate" an existing data class with TObject
> behaviour, short of having the existing class itself to inherit from
> TObject?
>
> Thanks and Ciao
> --
> Paolo Calafiura
> -------------------------------------------------------------------
> | Lawrence Berkeley National Lab | NERSC group |
> | MS 50E 124 | office 50E 1519 |
> | 1 Cyclotron Rd. | phone 1-510-486-6717 |
> | Berkeley, CA 94720 U.S. | fax 1-510-486-4004 |
> -------------------------------------------------------------------