Перегруженные функции скрыты в производном классе

В производном классе Если я переопределяю/перегружаю имя функции из базового класса,
то эти перегруженные функции недоступны/видимы для производного класса.
Почему это??

Если мы не перегружаем функцию oveloaded из базового класса в производном классе то все перегруженные версии этой функции доступны для производного класса
объекты, почему это?
в чем причина этого. Если вы объясните это на уровне компилятора и компоновщика
это будет более полезно для меня. не возможно ли поддерживать этот вид сценария?

Edited  
For examble:

class B  
{  

  public: 
     int f() {}
     int f(string s) {}
};

class D : public B
{
   public:
    int f(int) {}
};

int main()
{
   D d;
   d.f(1);
   //d.f(string);  //hidden for D
} 

Now object 'd' can't access f() and f(string).

Ответы

Ответ 1

TTBOMK у этого нет реальной технической причины, просто, что Stroustrup при создании языка считал это лучшим дефолтом. (В этом он аналогичен правилу, что rvalues ​​не подразумевает привязку к ссылкам не const.)

Вы можете легко обойти это, явно введя версии базового класса в область производного класса:

class base {
public:
  void f(int);
  void g(int);
};

class derived : public base {
public:
  using base::f;
  void f(float);
  void g(float); // hides base::g
};

или путем прямого вызова:

derived d;
d.base::g(42); // explicitly call base class version

Ответ 2

Функции доступны, вам просто нужно их явно вызвать:

struct A {
   void f(){}
};

struct B : public A {
   void f() {}
};

int main() {
   B b;
   b.f();     // call derived function
   b.A::f();  // call base function
}