struct A {
void f() { }
};
struct B : A {
void f(int) { }
};
int main() {
B obj_B;
obj_B.f(3);
// obj_B.f();
}
The compiler would not allow the function call obj_B.f() because
the declaration of void B::f(int) has hidden A::f().struct A {
void f() { }
};
struct B : A {
using A::f;
void f(int) { }
};
int main() {
B obj_B;
obj_B.f(3);
obj_B.f();
}
Because of the using declaration in
class B, the name f is overloaded
with two functions. The compiler will now allow the function call obj_B.f().#include <iostream>
using namespace std;
struct A {
void f() { }
void f(int) { cout << "void A::f(int)" << endl; }
};
struct B : A {
using A::f;
void f(int) { cout << "void B::f(int)" << endl; }
};
int main() {
B obj_B;
obj_B.f(3);
}
See the following output of the
above example: void B::f(int)
#include <iostream>
using namespace std;
struct A {
virtual void f() { cout << "void A::f()" << endl; }
virtual void f(int) { cout << "void A::f(int)" << endl; }
};
struct B : A {
using A::f;
void f(int) { cout << "void B::f(int)" << endl; }
};
int main() {
B obj_B;
A* pa = &obj_B;
pa->f(3);
pa->f();
}
In this example, B::f(int) is
a virtual function and overrides A::f(int) even with
the using A::f; declaration. The output is as below: void B::f(int)
void A::f()