C++ 在派生类中更改虚函数的参数意味着什么?

C++ 在派生类中更改虚函数的参数意味着什么?,c++,C++,禁止更改退货类型 然而,改变论点意味着什么?这是否意味着: 虚拟函数正在按预期正确地重新定义/重写 或 虚拟函数没有被重新定义/重写,但实际上在派生类中被重载。因此,如果虚函数是纯函数,则派生类仍然是抽象的 是1号还是2号还是别的什么?它超载了。参数是函数签名的一部分。是的,它仍然是抽象的 “禁止更改退货类型。” 就一般情况而言,这种假设是错误的 2.虚拟函数没有被重新定义/重写,但实际上在派生类中被重载。因此,如果虚拟函数是纯函数,则派生类仍然是抽象的 “是1号还是2号还是别的什么?” 现在是

禁止更改退货类型

然而,改变论点意味着什么?这是否意味着:

  • 虚拟函数正在按预期正确地重新定义/重写

  • 虚拟函数没有被重新定义/重写,但实际上在派生类中被重载。因此,如果虚函数是纯函数,则派生类仍然是抽象的


  • 是1号还是2号还是别的什么?

    它超载了。参数是函数签名的一部分。是的,它仍然是抽象的

    “禁止更改退货类型。”

    就一般情况而言,这种假设是错误的

    2.虚拟函数没有被重新定义/重写,但实际上在派生类中被重载。因此,如果虚拟函数是纯函数,则派生类仍然是抽象的

    “是1号还是2号还是别的什么?”

    现在是2点

    通过添加/更改参数/类型来更改函数的签名将不再匹配抽象基类提供的纯
    virtual
    函数签名

    所以是的。派生类没有为从基类继承的纯
    virtual
    函数声明提供实现,因此它仍然是抽象的

    禁止更改退货类型

    不,协变返回类型可以。例如

    struct A {};
    struct B: public A {};
    struct X {
      virtual A& foo() { return a; }
      A a;
    };
    struct Y: public X {
      B& foo() override { return b; }
      B b;
    };
    int main() {
      return sizeof(Y);
    }
    
    更改原型中的任何其他内容,包括参数列表,都会导致重载而不是重写。您可以使用“override”说明符轻松验证这一点

    正如Ben Voigt指出的,这里的“参数列表”意味着你声明的减去任何顶级简历资格的内容。也就是说,这两个函数被视为具有相同的类型:

    void foo(int, const char *);
    void bar(const int, const char * const);
    

    这将有助于找到这些引号的上下文。为了更好的可读性,我放了引号。我想说的是,如果派生类更改基类虚函数的参数而不是重写它,会发生什么?这意味着什么?顺便说一句,当你重写一个函数时,你可以更改返回类型,但你必须协变地这样做。我知道,但你不能在我相信的派生类中更改虚拟函数的返回类型?那是用直觉来确认的。@grenda“那是用直觉来确认的。”不,我很确定!你是在问确认书的事吗?这需要一两分钟。@πάνταῥεῖ: 我想他的意思是“我的直觉”,我的错。是的,这就是我的意思。@LightningRacisinObrit很聪明。@Grendan“@LightningRacisinObrit很聪明”她当然聪明!我指的是虚拟函数。我不知道协变是什么意思,但我在某个地方读到基类中的虚函数不能在派生类中更改其返回类型。请澄清一下。@Grendan:有什么需要澄清的?他说你的陈述是错误的。不需要重复你的错误陈述。。。除了参数上的顶级cv限定符不是函数签名的一部分,所以“其他所有内容”不包括这些限定符