在派生类中如果我从Base类重新定义/重载函数名,则 那些重载的函数对派生类是不可访问/可见的 为什么是这样??
如果我们不在派生类的基类中重载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).
答案 0 :(得分:14)
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
答案 1 :(得分:7)
这些功能可用,你只需要明确地调用它们:
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
}