Re: oop inheritance graph
On Jun 26, 7:51 am, "a" <a...@mail.com> wrote:
"James Kanze" <james.ka...@gmail.com>
???????:1182760064.267361.173...@n2g2000hse.googlegroups.com...
On Jun 25, 6:25 am, "a" <a...@mail.com> wrote:
I have an oop inheritance graph problem. What is the
difference betweent the following 2 inheritance graph? How
does the C++ solve the naming conflict problem for multiple
inheritance problem?
A
/ \
B C
\ /
D
A A
| |
B C
\ /
D
In the first, you only have a single instance of A; both B and C
have the same instance as their base class. In the second, you
have two instances. In C++, you use virtual inheritance to
achieve the first, e.g.:
First:
class A {} ;
class B : public virtual A {} ;
class C : public virtual A {} ;
class D : public B, public C {} ;
Second:
class A {} ;
class B : public A {} ;
class C : public A {} ;
class D : public B, public C {} ;
Note the presence of the keyword "virtual" in the inheritance in
the first.
I'm not too sure what you mean by "naming conflict". In the
first, there is only one instance of each class, so there is no
ambituity when referring to a base class. In the second, in D
(or when using an object of type D), any direct reference to A
is ambiguous, since the compiler doesn't know which one; to
disabmiguate, first refer to B or C, e.g. B::A::... or C::A::...
The naming conflict may occur between B and C, since they both
inherited from A. Both B and C have the properties inherited
from A, and they have the same name. So, naming conflict may
occurs.
By "properties", I presume you mean member variables, or ? And
by conflict, you mean ambiguity. If you use virtual inheritance
(the first schema), then there is no ambiguity, since there is
only one instance of A. If you don't use virtual inheritance,
then you refer to either B::A::memberOfA or C::A::memberOfA, in
order to distinguish.
I understand the purpose of the
keyword "virtual". But, in terms of "instance", what is the difference
between class B : public virtual A {} and class B : public A {}?
For class B alone, none, at least from the user's point of view.
It's only when you start to derive further that virtual
inheritance has an effect. With the virtual inheritance as
above, the class D has exactly one instance of A, and something
like B::A::someMember and C::A::someMember refer to exactly the
same object. Without the virtual inheritance, D will have two
instances of A, one as a sub-object of B, and the other as a
sub-object of C, and B::A::someMember and C::A::someMember will
refer to different objects.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34