Перегруженные функции скрыты в производном классе
В производном классе Если я переопределяю/перегружаю имя функции из базового класса,
то эти перегруженные функции недоступны/видимы для производного класса.
Почему это??
Если мы не перегружаем функцию 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
}