T
thomas
virtual inheritance is usually used to resolve the "diamond problem",
I wonder if there's any more benifits.
I wonder if there's any more benifits.
virtual inheritance is usually used to resolve the "diamond problem",
I wonder if there's any more benifits.
Wikipedia is your friend.
No, virtual inheritance is a solution to the diamond problem.
The diamond problem happens with multiple inheritance when the
multiple base classes have a common base class of their own.
The problem is: Should this common base class be duplicated in
the multiple-inherited class, or should it be merged into one?
If, for example, class A has a member function named foo(),
class B inherits from A, class C inherits from A, and finally
class D inherits from both B and C, and then you create an
object of type D and call its foo() member function, what
should happen?
Moreover, if a function in B calls a function in A which
modifies some member variable of A, and some other function in
C calls that same function in A, what should happen?
Should both the B and C calls cause the *same* member variable
to be modified, or should these two members be separate (so
that B has its own state, separate from C which has its own)?
Suppose you have an object of type D. If some function
somewhere expects an object of type A, and a member function
of B gives 'this' to it, what should happen? Likewise if a
member function of C calls that function taking an object of
type A. Should they pass their common A sub-object, or should
they pass separate A sub-objects? (This can make a huge
difference not only on the state of the A part of the object,
but because A might have some virtual function which both B
and C implement.)
Not using virtual inheritance is taking one stance (B and C
should be separate and have no common base), while using
virtual inheritance is taking another (their bases should be
merged). Thus virtual inheritance offers one solution to the
problem.
It discusses how some languages supporting multiple
inheritance deal with the problems.
I think it's you who is not understanding what the problem is
(which, quite frankly, I find quite surprising).
James Kanze said:Which only happens if there is virtual inheritance.
I think we have a problem of vocabulary. If the common base
class isn't merged, it isn't common---it's two distinct bases
(which perhaps happen to have the same type).
A shouldn't have any member variables. (Seriously, it is
*usually* a design error if A has any state.
It depends on the design. Any reasonably good OO language will
support both.
What they should pass isn't really the question. The question
is whether they should have separate sub-objects. Most of the
time, at least in the case of public inheritance, they
shouldn't; sometimes they should.
First, there's no problem; your design determines whether you
need a diamond or not. And the choice between virtual and
non-virtual inheritance allows choosing the appropriate solution
for the design.
The reason I don't understand what it is is that so many people
present so many different opinions about what it is. And that
to date, no one has shown me anything which could be considered
a problem with the diamond inheritance hierarchy; the problem
could be (in some other languages) that they don't support the
diamond hierarchy---a no-diamond problem.
virtual inheritance is usually used to resolve the "diamond problem",
I wonder if there's any more benifits.
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.