перегруженные функции скрыты в производном классе - PullRequest
14 голосов
/ 08 июля 2010

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

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

<b>Edited</b>  
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).

Ответы [ 2 ]

14 голосов
/ 08 июля 2010

TTBOMK это не имеет реальной технической причины, просто Stroustrup, создавая язык, счел это лучшим вариантом по умолчанию.(В этом оно похоже на правило, согласно которому значения r неявно не связываются с не 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
7 голосов
/ 08 июля 2010

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

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
}
...