A using declaration in a definition of a class A allows you to introduce a name of a data member or member function from a base class of A into the scope of A.
You would need a using declaration in a class definition if you want to create a set of overload a member functions from base and derived classes, or you want to change the access of a class member.
using declaration syntax >>-using--+-+----------+--+----+--nested_name_specifier--unqualified_id--;-+->< | '-typename-' '-::-' | '-::--unqualified_id--;------------------------------------------'
A using declaration in a class A may name one of the following:
The following example demonstrates this:
struct Z { int g(); }; struct A { void f(); enum E { e }; union { int u; }; }; struct B : A { using A::f; using A::e; using A::u; // using Z::g; };
The compiler would not allow the using declaration using Z::g because Z is not a base class of A.
A using declaration cannot name a template. For example, the compiler will not allow the following:
struct A { template<class T> void f(T); }; struct B : A { using A::f<int>; };
Every instance of the name mentioned in a using declaration must be accessible. The following example demonstrates this:
struct A { private: void f(int); public: int f(); protected: void g(); }; struct B : A { // using A::f; using A::g; };
The compiler would not allow the using declaration using A::f because void A::f(int) is not accessible from B even though int A::f() is accessible.
Related information