oop inheritance graph

Discussion in 'C++' started by a, Jun 25, 2007.

  1. a

    a Guest

    Hi,
    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?

    Thanks

    A
    / \
    B C
    \ /
    D


    A A
    | |
    B C
    \ /
    D
    a, Jun 25, 2007
    #1
    1. Advertising

  2. a

    aaragon Guest

    On Jun 24, 11:25 pm, "a" <> wrote:
    > Hi,
    > 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?
    >
    > Thanks
    >
    > A
    > / \
    > B C
    > \ /
    > D
    >
    > A A
    > | |
    > B C
    > \ /
    > D


    There is no difference between the two graphs that you draw since both
    B and C inherit from A in both graphs. You have to use "virtual
    inheritance" for class A. Scott Meyers discusses this point in detail
    in his book Effective C++ (item 43). You may want to avoid this kind
    of inheritance graph. The naming convention is defined by the closest
    definition of a function to D. For example, if A defines foo() and
    this is redefined in C, D uses the C version of foo(). Hope it helps.
    aaragon, Jun 25, 2007
    #2
    1. Advertising

  3. a

    Sumit Rajan Guest

    a wrote:
    > Hi,
    > 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?
    >
    > Thanks
    >
    > A
    > / \
    > B C
    > \ /
    > D
    >
    >
    > A A
    > | |
    > B C
    > \ /
    > D
    >
    >


    Please see:
    http://www.parashift.com/c -faq-lite/multiple-inheritance.html

    --
    Sumit Rajan <>
    Sumit Rajan, Jun 25, 2007
    #3
  4. a

    James Kanze Guest

    On Jun 25, 6:25 am, "a" <> 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::...

    --
    James Kanze (GABI Software, from CAI) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
    James Kanze, Jun 25, 2007
    #4
  5. a

    Pete Becker Guest

    aaragon wrote:
    > On Jun 24, 11:25 pm, "a" <> wrote:
    >> Hi,
    >> 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?
    >>
    >> Thanks
    >>
    >> A
    >> / \
    >> B C
    >> \ /
    >> D
    >>
    >> A A
    >> | |
    >> B C
    >> \ /
    >> D

    >
    > There is no difference between the two graphs that you draw since both
    > B and C inherit from A in both graphs. You have to use "virtual
    > inheritance" for class A. Scott Meyers discusses this point in detail
    > in his book Effective C++ (item 43). You may want to avoid this kind
    > of inheritance graph. The naming convention is defined by the closest
    > definition of a function to D. For example, if A defines foo() and
    > this is redefined in C, D uses the C version of foo(). Hope it helps.
    >


    No, you don't "have to" use virtual inheritance. That's the difference
    between them: the top one uses it and the bottom one doesn't.

    --

    -- Pete
    Roundhouse Consulting, Ltd. (www.versatilecoding.com)
    Author of "The Standard C++ Library Extensions: a Tutorial and
    Reference." (www.petebecker.com/tr1book)
    Pete Becker, Jun 25, 2007
    #5
  6. a

    a Guest

    "James Kanze" <>
    ???????:...
    On Jun 25, 6:25 am, "a" <> 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::...

    --
    James Kanze (GABI Software, from CAI) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

    Thank you for your reply.
    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. 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 {}?

    Thanks
    a, Jun 26, 2007
    #6
  7. a

    James Kanze Guest

    On Jun 26, 7:51 am, "a" <> wrote:
    > "James Kanze" <>
    > > ???????:...
    > > On Jun 25, 6:25 am, "a" <> 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:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
    James Kanze, Jun 26, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. George Sakkis
    Replies:
    1
    Views:
    450
    Szabolcs Nagy
    Jan 29, 2007
  2. Dr Ann Huxtable

    Missing Graph.h and (Graph.lib) woes - any help

    Dr Ann Huxtable, Dec 21, 2004, in forum: C Programming
    Replies:
    6
    Views:
    651
    Dr Ann Huxtable
    Dec 21, 2004
  3. Jef Driesen
    Replies:
    3
    Views:
    2,544
    mlimber
    Jan 24, 2006
  4. Almoni
    Replies:
    0
    Views:
    3,099
    Almoni
    Jan 17, 2010
  5. Emilio Mayorga
    Replies:
    6
    Views:
    332
    Martien Verbruggen
    Oct 8, 2003
Loading...

Share This Page