[Newbie] Namespace and inheritance...

P

plug.gulp

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
 
V

Victor Bazarov

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
 
B

Bo Persson

(e-mail address removed) 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
 
B

Bo Persson

Bo Persson skrev 2012-07-14 13:51:
(e-mail address removed) skrev 2012-07-13 22:54:

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
 
J

Jamie

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.

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
 

Ask a Question

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.

Ask a Question

Members online

Forum statistics

Threads
473,961
Messages
2,570,130
Members
46,689
Latest member
liammiller

Latest Threads

Top