C++ 继承时重命名函数参数

C++ Rename function argument when inheriting?

本文关键字:函数 参数 重命名 继承 C++      更新时间:2023-10-16

如果我覆盖虚拟方法,我可以更改子参数的名称吗?相同类型的论点,只是将(int num)改为(int n)

这个例子有效吗?

class Animal
{
    public:
    virtual int foo(int num) {
        return num + 1;
    }
};
class Cat : public Animal
{
    public:
    int foo(int n) override {
        return n - 1;
    }
};

如果是,为什么参数名称无关紧要?

参数的名称无关紧要。

唯一必须匹配的是参数的类型。

以及类方法本身是否const,以及是否。并且该方法的返回值必须匹配。

为了给出正确的答案,参数的名称无关紧要,因为它们不是函数签名的一部分。有关(相当全面的)解释,请参阅 http://en.cppreference.com/w/cpp/language/function。

顺便说一下,论点本身的const性也不是签名的一部分。这样,void foo(const int x);foo (int x)是等效的。

我用一个额外的代码编译了代码:

int main() {
    // your code goes here
    Animal a;
    Cat c;
    cout << a.foo(4) << endl;
    cout << c.foo(4) <<endl;
    return 0;
}

这运行并给出了 5、3 的预期输出。

因此,更改参数名称似乎是完全有效的。

只要参数的作用域限定为要声明的函数,就可以。重要的是参数和类型的数量,因此请确保覆盖函数与基函数具有相同的signature

class Animal
{
    public:
    virtual int foo(int) { // even no parameter identifier and it is ok
        return 0;
    }
};
class Cat : public Animal
{
    public:
        int foo(int n) {
        return n - 1;
    }
};

使用虚拟方法时,您需要做的就是保持方法的声明相同。也就是说,如果我谈论您的代码,您可以更改变量号,但不能更改数据类型、参数列表、返回类型和函数名称