Отсутствует «виртуальный» квалификатор в объявлениях функций - PullRequest
4 голосов
/ 04 декабря 2008

Проходя по старому коду, я обнаружил нечто похожее на следующее:

class Base
{
public:
    virtual int Func();
    ...
};

class Derived : public Base
{
public:
    int Func(); // Missing 'virtual' qualifier
    ...
};

Код прекрасно компилируется (MS VS2008) без предупреждений (уровень 4) и работает как положено - Func является виртуальным, даже если в производном классе отсутствует виртуальный классификатор. Теперь, кроме того, чтобы вызвать некоторую путаницу, есть ли опасность с этим кодом или я должен изменить все это, добавив квалификатор virtual?

Ответы [ 4 ]

10 голосов
/ 04 декабря 2008

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

Даже классы, расширяющие Derived, будут иметь виртуальные методы Func.

Ссылка: Виртуальные функции в MSDN. Прокрутите страницу вниз, чтобы увидеть

Ключевое слово virtual можно использовать, когда объявляя переопределяющие функции в производный класс, но он не нужен; переопределение виртуальных функций всегда виртуальный.

2 голосов
/ 04 декабря 2008

Вот интересное следствие того, что нет необходимости объявлять переопределенные функции виртуальными:

template <typename Base>
struct Derived : Base
{
    void f();
};

Будет ли Derived's f виртуальным, зависит от того, создан ли Derived с помощью Base с виртуальной функцией f правильной сигнатуры.

0 голосов
/ 18 января 2009

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

Я подозреваю, что некоторые инструменты анализа кода могут быть недостаточно умными, чтобы унаследовать унаследованную виртуальность.

0 голосов
/ 04 декабря 2008

Кто-то сказал мне однажды, что очень старые компиляторы C ++, не соответствующие спецификации, требуют, чтобы для всех подклассов был установлен виртуальный. Это больше не проблема.

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