To make hidden names visible again, employ using declarations or forwarding functions.
2 using namespace std;
3
4 class Base
5 {
6 private:
7 int x;
8
9 public:
10 virtual void mf1() = 0;
11 virtual void mf1(int)
12 {
13 cout << "mf1(int) in base" << endl;
14 }
15
16 virtual void mf2()
17 {
18 cout << "mf2 in base" << endl;
19 }
20
21 void mf3()
22 {
23 cout << "mf3 in base" << endl;
24 }
25
26 void mf3(double)
27 {
28 cout << "mf3(double) in base" << endl;
29 }
30 };
31
32 class Derived: public Base
33 {
34 public:
35 using Base::mf1; // make all things in Base named mf1 and mf3
36 using Base::mf3; // visible (and public) in Derived's scope
37
38 virtual void mf1()
39 {
40 cout << "mf1 in derived" << endl;
41 }
42
43 void mf3()
44 {
45 cout << "mf3 in derived" << endl;
46 }
47
48 void mf4()
49 {
50 cout << "mf4 in derived" << endl;
51 }
52 };
53
54
55
56 int main()
57 {
58 Derived d;
59
60 int x = 0;
61 d.mf1(); // still fine, still calls Derived::mf1
62
63 d.mf1(x); // now okay, calls Base::mf1
64
65 d.mf2(); // still fine, still calls Base::mf2
66
67 d.mf3(); // fine, calls Derived::mf3
68
69 d.mf3(x); // now okay, calls Base::mf3
70
71 cin.get();
72
73 return 0;
74 }