Re: I wish c++ did interfaces better.
Stuart Golodetz wrote:
Stuart Golodetz wrote:
kwikius wrote:
Chris Becke wrote:
You know.
That works.
Im sure I tried virtual inheritance before and it did not work.
Perhaps it collapsed because the compiler i tried with (VC++ 8)
doesn't implement virtual base classes correctly, or perhaps there
is something fundamental that goes wrong when one tries to mix in
overridden and inherited methods.
Well.. I think I too know the "Doh..!" feeling... ;-)
Example was tested in VC8 FWIW, maybe your version was being grumpy
today. Mine does that sometimes. Compilers... Love em hate but cant
do without em.
regards
Andy Little
Sorry to piggy-back on this thread, but it reminded me of a related
interfaces problem I had a while back actually (I found a way to
circumvent it, but it was a bit unsatisfactory).
Suppose you're implementing an inheritance hierarchy of Cartesian
coordinate systems. You start off with interfaces:
ICoordSystem <-- IOrthogonalCoordSystem <-- IOrthonormalCoordSystem
(And when I say interfaces, I mean interface classes... I really am
talking about C++ here :-) Though the code was being ported from Java,
which is why I encountered this sort of problem.)
You then want to implement each of these concretely:
ICoordSystem <-- CoordSystem
IOrthogonalCoordSystem <-- OrthogonalCoordSystem
IOrthonormalCoordSystem <-- OrthonormalCoordSystem
The only problem is, you want to reuse the logic in CoordSystem etc.,
so you also have this:
CoordSystem <-- OrthogonalCoordSystem <-- OrthonormalCoordSystem
At this point, I started having fun with my compiler. It was a while
back now, so I can't quite remember what I tried any more before
giving up and doing it another way, but how should I have done it
please, out of interest?
I had come across virtual inheritance back then, but I clearly wasn't
applying it as I should have been!
Cheers,
Stu
Ok, I've recreated the problem:
struct I1
{
virtual void f() = 0;
};
struct I2 : virtual I1
{
virtual void g() = 0;
};
struct I3 : virtual I2
{
virtual void h() = 0;
};
struct C1 : virtual I1
{
void f()
{
std::cout << "f()" << std::endl;
}
};
struct C2 : C1, virtual I2
{
void g()
{
std::cout << "g()" << std::endl;
}
};
struct C3 : C2, I3
{
void h()
{
std::cout << "h()" << std::endl;
}
};
When I do this, I get compiler warnings:
Warning 1 warning C4250: 'C2' : inherits 'C1::C1::f' via dominance
Warning 2 warning C4250: 'C3' : inherits 'C1::C1::f' via dominance
Warning 3 warning C4250: 'C3' : inherits 'C2::C2::g' via dominance
Please can someone explain what's going on?
Cheers!
Stu