Явные переопределения и финальный c ++ 0x - PullRequest
5 голосов
/ 04 января 2012

Согласно Википедии , в этом примере:

struct Base {
    virtual void some_func(float);
};

struct Derived : Base {
    virtual void some_func(float) override;
};

Я думал, override не было ключевым словом C ++, так что это на самом деле означает?Мы можем добиться того же без этого ключевого слова, так зачем кому-то это нужно?

Также есть ключевое слово final, которое еще не работает на VS2010:

struct Base1 final { };

struct Derived1 : Base1 { }; // ill-formed because the class Base1 
                             // has been marked final

1 Ответ

16 голосов
/ 04 января 2012

В C ++ 11 override и final являются «идентификаторами со специальным значением». Они не являются ключевыми словами и приобретают особое значение, только если используются в определенном контексте (при объявлении виртуальных функций).

Идея состоит в том, чтобы дать возможность компилятору перехватывать определенные типы ошибок, позволяя программисту явно заявить о своем намерении (например, переопределить существующую виртуальную функцию вместо создания новой).

Вот соответствующая цитата из стандарта с примерами:

C ++ 11 10.3 4 Если виртуальная функция f в некотором классе B помечена вирт-спецификатор final и в классе D, производном от B, функция D :: f переопределяет B :: f, программа некорректна. [Пример:

struct B {
virtual void f() const final;
};
struct D : B {
void f() const; // error: D::f attempts to override final B::f
};

- конец примера]

5 Если виртуальная функция помечена с помощью virt-specier override и не переопределяет функцию-член базового класса, программу плохо сформирован. [Пример:

struct B {
virtual void f(int);
};
struct D : B {
void f(long) override; // error: wrong signature overriding B::f
void f(int) override; // OK
};

- конец примера]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...