Hi Matt,
On Fri, 7 Dec 2001 12:28:42 +0000
Matt Palmer <palmer@hep.phy.cam.ac.uk> wrote
concerning "[ROOT] General questions":
> 2. I made a simple little 3D viewer for some of my data (which was
> impressively easy :) ). However, I use TPolyLine3D to do the
> drawing and I can't get any of the lines to be drawn in different
> colours. Currently I do something like:
> TPolyLine3D* beamaxis = new TPolyLine3D(2);
> beamaxis->SetPoint(0, 1000, 1000, 0);
> beamaxis->SetPoint(1, 1000, 1000, 2000);
> gStyle->SetLineColor(2);
> beamaxis->UseCurrentStyle();
> beamaxis->Draw();
Use TPolyLine3D::SetLinecolor(Color_t);
> As a general point tho, I think I am right in saying that multiple
> inheritance of non-pure virtual classes (ie non-interfaces) in
> object hierachies with a single shared parent base class (ie
> TObject) cannot work ...that's why it isn't allowed in Java, .NET
> etc
It will work if you have _virtual_ inheritance! See also the ANSI/ISO
C++ standard chapter 10. Suppose you have
#include <iostream>
#ifdef USE_VIRTUAL
#define VIRTUAL virtual
#else
#define VIRTUAL
#endif
class A {
public: virtual void f() { cout << "A:f" << endl; }};
class B : VIRTUAL public A {
#ifdef USE_OVERLOAD
public: virtual void f() { cout << "B::f" << endl; }
#endif
};
class C : VIRTUAL public A {
#ifdef USE_OVERLOAD
public: virtual void f() { cout << "C::f" << endl; }
#endif
};
class D : public B, public C { };
int main()
{
D d;
d.f();
return 0;
}
With USE_VIRTUAL undefined, it will not work, since you cannot find a
unique calling sequence to A::f
A A
\ /
B C
\ /
D
Compiling with GCC like
prompt% g++ foo.cxx -o foo
foo.cxx: In function `int main()':
foo.cxx:28: request for method `f' is ambiguous
On the other hand, if we do define USE_VIRTUAL, it will work.
prompt% g++ foo.cxx -o foo -DUSE_VIRTUAL
prompt% ./foo
A:f
This is because we now have for A::f
A
/ \
B C
\ /
D
Now, if we define USE_OVERLOAD, then we get into trouble again:
prompt% g++ foo.cxx -o foo -DUSE_VIRTUAL -DUSE_OVERLOAD
foo.cxx: In function `int main()':
foo.cxx:27: cannot declare variable `d' to be of type `D'
foo.cxx:27: since the following virtual functions need a final overrider:
foo.cxx:27: void B::f()
foo.cxx:28: request for method `f' is ambiguous
So it seems C++ fares better than Java and .NET :-). Now, wether this
would be a good strategy for ROOT classes to follow is an entirely
different matter.
Yours,
Christian Holm Christensen -------------------------------------------
Address: Sankt Hansgade 23, 1. th. Phone: (+45) 35 35 96 91
DK-2200 Copenhagen N Cell: (+45) 28 82 16 23
Denmark Office: (+45) 353 25 305
Email: cholm@nbi.dk Web: www.nbi.dk/~cholm
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:11 MET