В производном классе, Если я переопределяю/перегружаю имя функции от Базового класса,
затем те перегруженные функции не являются accessable/visible к производному классу.
Почему это??
Если мы не перегружаем функцию oveloaded от базового класса в производном классе затем, все перегруженные версии той функции доступны производному классу
объекты, почему это??
какова причина позади этого. Если Вы объясняете это на уровне компоновщика и компиляторе
это будет более полезно мне. разве не возможно поддерживать этот вид scinario??
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).
TTBOMK у этого нет реальной технической причины, просто Страуструп при создании языка посчитал это лучшим вариантом по умолчанию. (Это похоже на правило, согласно которому значения rvalue не связываются неявно со ссылками, отличными от 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
Функции доступны, нужно только вызвать их явно:
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
}