[Newbie] Namespace and inheritance...

Discussion in 'C++' started by plug.gulp@gmail.com, Jul 13, 2012.

  1. Guest

    Hello,

    I am learning C++. I wrote the following C++ code to understand namespace and inheritance. It does not compile(g++ 4.6.3), but when I explicitly specify the scope resolution the program works. Why am I not able to directly call the public method implemented in the base class?


    namespace N1 {
    class C
    {
    public:
    void F(const std::string& s)
    {
    std::cout << "N1::C::F(str): " << s.c_str() << std::endl;
    }
    };
    };

    namespace N2 {
    class C : public N1::C
    {
    public:
    void F(int i)
    {
    std::cout << "N2::C::F(int): " << i << std::endl;
    }
    };
    };

    int main()
    {
    N2::C c;
    c.F(1);

    // The following statement does not compile unless
    // it is called with full scope resolution as follows:
    // c.N1::C::F("one");

    c.F("one");

    return 0;
    }

    Thanks and regards,

    Plug
    , Jul 13, 2012
    #1
    1. Advertising

  2. On 7/13/2012 4:54 PM, wrote:
    > Hello,
    >
    > I am learning C++. I wrote the following C++ code to understand
    > namespace and inheritance. It does not compile(g++ 4.6.3), but when I
    > explicitly specify the scope resolution the program works. Why am I not
    > able to directly call the public method implemented in the base class?
    >
    >
    > namespace N1 {
    > class C
    > {
    > public:
    > void F(const std::string& s)
    > {
    > std::cout << "N1::C::F(str): " << s.c_str() << std::endl;
    > }
    > };
    > };
    >
    > namespace N2 {
    > class C : public N1::C
    > {
    > public:
    > void F(int i)
    > {
    > std::cout << "N2::C::F(int): " << i << std::endl;
    > }
    > };
    > };
    >
    > int main()
    > {
    > N2::C c;
    > c.F(1);
    >
    > // The following statement does not compile unless
    > // it is called with full scope resolution as follows:
    > // c.N1::C::F("one");
    >
    > c.F("one");
    >
    > return 0;
    > }


    This is covered by the FAQ. Please read FAQ before posting. You can
    find the FAQ Lite here: http://www.parashift.com/c -faq-lite/. Hint:
    see section 23. And crank up the warning level on your compiler, maybe
    you will get a useful diagnostic out of that tool for a change...

    V
    --
    I do not respond to top-posted replies, please don't ask
    Victor Bazarov, Jul 13, 2012
    #2
    1. Advertising

  3. Bo Persson Guest

    skrev 2012-07-13 22:54:
    > Hello,
    >
    > I am learning C++. I wrote the following C++ code to understand namespace and inheritance. It does not compile(g++ 4.6.3), but when I explicitly specify the scope resolution the program works. Why am I not able to directly call the public method implemented in the base class?
    >
    >
    > namespace N1 {
    > class C
    > {
    > public:
    > void F(const std::string& s)
    > {
    > std::cout << "N1::C::F(str): " << s.c_str() << std::endl;
    > }
    > };
    > };
    >
    > namespace N2 {
    > class C : public N1::C
    > {
    > public:
    > void F(int i)
    > {
    > std::cout << "N2::C::F(int): " << i << std::endl;
    > }
    > };
    > };
    >
    > int main()
    > {
    > N2::C c;
    > c.F(1);
    >
    > // The following statement does not compile unless
    > // it is called with full scope resolution as follows:
    > // c.N1::C::F("one");
    >
    > c.F("one");
    >
    > return 0;
    > }
    >


    It has nothing to do with namespaces.

    Declaring something named F in the derived class hides the name F from
    any base classes. This is similar to declaring local variables in an
    inner scope which hides names from outer scopes.

    If you want to use the name anyway, you can either use the full name
    (like you did), or add a "using N1::C::F;" to class C2.


    Bo Persson
    Bo Persson, Jul 14, 2012
    #3
  4. Bo Persson Guest

    Bo Persson skrev 2012-07-14 13:51:
    > skrev 2012-07-13 22:54:
    >> Hello,
    >>
    >> I am learning C++. I wrote the following C++ code to understand
    >> namespace and inheritance. It does not compile(g++ 4.6.3), but when I
    >> explicitly specify the scope resolution the program works. Why am I
    >> not able to directly call the public method implemented in the base
    >> class?
    >>
    >>
    >> namespace N1 {
    >> class C
    >> {
    >> public:
    >> void F(const std::string& s)
    >> {
    >> std::cout << "N1::C::F(str): " << s.c_str() <<
    >> std::endl;
    >> }
    >> };
    >> };
    >>
    >> namespace N2 {
    >> class C : public N1::C
    >> {
    >> public:
    >> void F(int i)
    >> {
    >> std::cout << "N2::C::F(int): " << i << std::endl;
    >> }
    >> };
    >> };
    >>
    >> int main()
    >> {
    >> N2::C c;
    >> c.F(1);
    >>
    >> // The following statement does not compile unless
    >> // it is called with full scope resolution as follows:
    >> // c.N1::C::F("one");
    >>
    >> c.F("one");
    >>
    >> return 0;
    >> }
    >>

    >
    > It has nothing to do with namespaces.
    >
    > Declaring something named F in the derived class hides the name F from
    > any base classes. This is similar to declaring local variables in an
    > inner scope which hides names from outer scopes.
    >
    > If you want to use the name anyway, you can either use the full name
    > (like you did), or add a "using N1::C::F;" to class C2.


    ^^^^^^^^
    Here "class C2" of course should be "class C in namespace N2".


    Bo Persson
    Bo Persson, Jul 14, 2012
    #4
  5. Jamie Guest

    What is "namespace"? What is a name? Do you know what a "name" is? You use
    it like a weapon. So let it be written.

    <> wrote in message
    news:...
    Hello,

    I am learning C++. I wrote the following C++ code to understand namespace
    and inheritance. It does not compile(g++ 4.6.3), but when I explicitly
    specify the scope resolution the program works. Why am I not able to
    directly call the public method implemented in the base class?


    namespace N1 {
    class C
    {
    public:
    void F(const std::string& s)
    {
    std::cout << "N1::C::F(str): " << s.c_str() << std::endl;
    }
    };
    };

    namespace N2 {
    class C : public N1::C
    {
    public:
    void F(int i)
    {
    std::cout << "N2::C::F(int): " << i << std::endl;
    }
    };
    };

    int main()
    {
    N2::C c;
    c.F(1);

    // The following statement does not compile unless
    // it is called with full scope resolution as follows:
    // c.N1::C::F("one");

    c.F("one");

    return 0;
    }

    Thanks and regards,

    Plug
    Jamie, Jul 15, 2012
    #5
    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. Èý¹â
    Replies:
    1
    Views:
    555
    William F. Robertson, Jr.
    Jul 29, 2003
  2. Replies:
    0
    Views:
    5,110
  3. Anonymous
    Replies:
    3
    Views:
    513
    Ron Natalie
    Aug 18, 2003
  4. Tomas
    Replies:
    4
    Views:
    337
  5. Rouslan Korneychuk
    Replies:
    8
    Views:
    585
    Rouslan Korneychuk
    Feb 10, 2011
Loading...

Share This Page