Информация об изменениях

Сообщение Изменение сигнатуры виртуальной функции от 18.04.2023 14:13

Изменено 18.04.2023 14:15 Muxa

Изменение сигнатуры виртуальной функции
Есть два класса — первый определяет интерфейс, второй его реализует:
class I
{
    virtual I* F0() = 0;
    virtual I& F1() = 0;
    virtual void F2(I*) = 0;
    virtual void F3(I&) = 0;
};

class C : public I
{
    C* F0() override { return this; }
    C& F1() override { return *this; }
    void F2(C*) override {}
    void F3(C&) override {}
};


Но в сигнатурах функций-реализаций я заменил тип I на C.
Первые две функции компилятор (gcc/clang) прожевывает без проблем, а на вторые две выдает ошибку
'void C::F2(C*)' marked 'override', but does not override


Почему компилятор такое позволяет для F0 и F1, но не позволяет для F2 и F3?
Изменение сигнатуры виртуальной функции
Есть два класса — первый определяет интерфейс, второй его реализует:
class I
{
    virtual I* F0() = 0;
    virtual I& F1() = 0;
    virtual void F2(I*) = 0;
    virtual void F3(I&) = 0;
};

class C : public I
{
    C* F0() override { return this; }
    C& F1() override { return *this; }
    void F2(C*) override {}
    void F3(C&) override {}
};
https://godbolt.org/z/qd4so7TW3

В сигнатурах функций-реализаций я заменил тип I на C.

Первые две функции компилятор (gcc/clang) прожевывает без проблем, а на вторые две выдает ошибку
'void C::F2(C*)' marked 'override', but does not override


Почему компилятор такое позволяет для F0 и F1, но не позволяет для F2 и F3?