为什么如果在派生类中重载了基类函数,则无法通过派生类的对象访问该函数的基类版本(即使是公共(public)的)?
例如:
#include <iostream>
#include <string>
using namespace std;
class Base {
public:
void f(int i) {
cout << "\nInteger: " << i << endl;
}
};
class Derived : public Base {
public:
void f(string s) {
cout << "\nString: " << s << endl;
}
};
int main() {
Base b;
Derived d;
//d.f(5); Doesn't work
d.f("Hello");
//d.Base::f(5); works though
return 0;
}
最佳答案
名称查找在重载解析之前执行。名称查找从一个作用域开始,然后如果它没有找到该名称的声明,它将搜索封闭的作用域,依此类推,直到找到该名称。在这种情况下,d.f
找到声明 void Derived::f(string)
。只有当 Derived
中没有成员 f
的声明时,名称查找才会继续搜索基类。只有找到名称后,编译器才会确定是否存在合适的重载,如果有,哪个重载是最匹配的。
请注意,您可以在派生类中重新声明基类函数,以强制找到它:
class Derived : public Base {
public:
using Base::f;
void f(string s) {
cout << "\nString: " << s << endl;
}
};
现在名称查找将找到 f
的两个重载,然后重载解析将决定调用哪一个。
关于c++ - 在派生类中重载基类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29451516/