Поведение виртуальной функции в C++

У меня есть вопрос, вот два класса ниже:

  class Base{
      public:
          virtual void toString();       // generic implementation
  }

  class Derive : public Base{
      public:
          ( virtual ) void toString();   // specific implementation
  }

Вопрос:

  • Если я хочу подкласс класса, Происходят, выполняют polymophism использование указателя Основы типа, действительно ли ключевое слово является виртуальным в необходимой скобке?

  • Если ответ не, каково различие между функцией членства toString класса, Происходят с и без виртуального?

10
задан Summer_More_More_Tea 20 April 2010 в 00:43
поделиться

7 ответов

C ++ 03 §10.3 / 2:

Если виртуальная функция-член vf объявлена ​​в классе Base и в классе Derived, производном напрямую или косвенно из Base, член {{ 1}} функция vf с тем же именем и тем же списком параметров, что и Base :: vf, объявлена ​​ , тогда Derived :: vf также является виртуальным (независимо от того, не так объявлено) и переопределяет Base :: vf.

13
ответ дан 3 December 2019 в 14:43
поделиться

Компилятор уже знает из ключевого слова virtual в базовом классе, что toString является виртуальным методом. Не нужно повторять это.

1
ответ дан 3 December 2019 в 14:43
поделиться

Функция однажды виртуальная всегда виртуальная .

Таким образом, в любом случае, если ключевое слово virtual не используется в последующих классах, это не мешает функции / методу быть «виртуальными», т.е. быть переопределенными. Таким образом, следующее руководство может помочь с точки зрения командной разработки: -

  • Если функция / метод предполагается переопределить, всегда используйте ключевое слово 'virtual'. Это особенно верно при использовании в интерфейсных / базовых классах.
  • Если производный класс должен быть подклассом, дальнейшая ясность укажите "виртуальное" ключевое слово для каждой функции / метода, которые могут быть переопределено.
  • Если функция / метод в производном классе не предполагается снова подклассифицировать, тогда ключевое слово 'виртуальный' следует прокомментировать {{1 }}, указывающий, что функция / метод была переопределена, но нет дополнительных классов, которые снова переопределяют ее . Это, конечно, не мешает кому-либо переопределить в производном классе , если класс не станет окончательным (не производным), но указывает, что метод не предполагается переопределить. Пример: / * virtual * / void someFunc ();
1
ответ дан 3 December 2019 в 14:43
поделиться

Это вопрос хорошего стиля, и пользователь-программист знает, что происходит. В C ++ 0x вы можете использовать [[override]], чтобы сделать его более явным и видимым. Вы можете использовать [[base_check]], чтобы принудительно использовать [[override]].

Если вы не хотите или не можете этого сделать, просто используйте ключевое слово virtual.

Если вы производите наследование без виртуального toString и приводите экземпляр Derive обратно к Base, вызов toString () фактически вызовет метод Base toString (), поскольку, насколько ему известно, это экземпляр Base.

0
ответ дан 3 December 2019 в 14:43
поделиться

Для компилятора не имеет значения, указываете ли вы ключевое слово virtual в производных версиях функция.

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

0
ответ дан 3 December 2019 в 14:43
поделиться

Это ключевое слово является необязательным и не имеет никакого значения.

10
ответ дан 3 December 2019 в 14:43
поделиться

Свойство виртуальное унаследовано от базового класса и предполагается, что оно присутствует, даже если вы не вводите его.

7
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: