overloaded functions are hidden in derived class
在派生类中,如果我重新定义/重载基类中的函数名,那么这些重载函数对派生类是不可访问/可见的。这是为什么??
如果我们不从派生类中的基类重载oveLoaded函数然后,该函数的所有重载版本都可用于派生类对象,这是为什么??这背后的原因是什么?如果您在编译器和链接器级别解释这个问题那对我更有帮助。不可能支持这种闪烁吗??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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这没有真正的技术原因,只是stroustrup在创建语言时认为这是更好的默认值。(在这个规则中,它类似于rvalues不隐式绑定到非
您可以很容易地解决这个问题,即显式地将基类版本引入派生类的范围:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 }; |
或者通过明确地调用:
1 2 | derived d; d.base::g(42); // explicitly call base class version |
号
函数是可用的,您只需显式调用它们:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 } |