为什么C 不支持范围内的过载

Why C++ does not support overloading across scopes?

本文关键字:范围内 不支持 为什么      更新时间:2023-10-16

我相信这里已经给出了最好的答案:为什么在派生类中覆盖的函数隐藏了基类的其他过载?

但是我有点困惑,特别是与以下陈述:

为了覆盖此行为,用户需要明确的诉讼:最初是对继承方法的重新分支(当前已弃用),现在明确使用使用declaration。

假设我有以下程序:

#include <iostream>
using namespace std;
class Base
{
public:
    int f(int i)
    {
        cout << "f(int): ";
        return i+3;
    }
};
class Derived : public Base
{
public:
    double f(double d)
    {
        cout << "f(double): ";
        return d+3.3;
    }
};
int main()
{
    Derived* dp = new Derived;
    cout << dp->f(3) << 'n';
    cout << dp->f(3.3) << 'n';
    delete dp;
    return 0;
}

我有两个问题:

  1. 我可以假设,W.R.T派生的类对象,int f(int i)函数根本不存在。这不是由于隐藏名称而继承的。

  2. 如果我必须在派生类中使用此功能,我必须在派生类中再次定义它?

  1. 我可以假设,W.R.T派生的类对象,根本不存在int f(int i)函数。这不是由于隐藏名称而继承的。

it 继承,只是... hidden ,如果您不指定范围(不合格的名称查找。您可以指定它)明确使用范围分辨率运算符::(合格的名称查找):

dp->Base::f(3);
  1. 如果我必须在派生类中使用此功能,则必须在派生类中再次定义它?

如引用的答案所说,您可以通过"明确使用使用解释"来完成。

class Derived : public Base
{
public:
    using Base::f;
    ...
};

编辑(有关评论的补充问题)

  1. 如果它是隐藏的,那意味着我可以再次声明它?同名,相同的参数?

是的,你可以。它仍然是隐藏的名字。

  1. 如果是,如果我还添加了using Base::f以及新声明怎么办?它会导致双重定义吗?

不,这不是双重定义。使用声明只会将名称引入派生的类范围。并且在派生类中声明的成员函数将隐藏从基类引入的函数,它仍然是隐藏的。(请注意,您仍然可以通过dp->Base::f(3);调用基类。)

如果派生类已经具有具有相同名称,参数列表和资格的成员,则派生的类成员生皮或覆盖(不与)从基类引入的成员。