c++ - 在派生类中重载基类函数

标签 c++

为什么如果在派生类中重载了基类函数,则无法通过派生类的对象访问该函数的基类版本(即使是公共(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/

相关文章:

c++ - 在定义一个充满成员的结构时,是否为该结构类型的每个变量创建了这些成员?

c++ - 使用 ifstream 检查 C++ 中的数据类型

C++ 头文件到源代码?

c++ - 这里涉及函数调用和参数传递的概念

C++ 如何将百万个对象存储到数组中而没有段错误

c++ - 将 JPEG 解码为 char*

c++ - 访问派生类中的成员模板函数中的元素时,unordered_map 的性能低下

c++ - 如何在 C/C++ 中默认初始化函数指针?

c++ - 如何使用 Eigen 不受支持的 levenberg marquardt 实现?

c++ - 是否可以根据调用站点的上下文指定不同的 C++ `operator==` 功能?