В чем разница между созданием экземпляров виртуальных функций в C++?

StackOverflow https://stackoverflow.com/questions/1420552

Вопрос

В чем разница между следующими двумя декларациями?

virtual void calculateBase() = 0;  
virtual void calculateBase();

Я прочитал, что первая (= 0) является «чистой абстрактной функцией», но что это делает вторую?

Это было полезно?

Решение

Первая называется чистой виртуальной функцией. Обычно чисто виртуальные функции не имеют никакой реализации, и вы не можете создать экземпляр класса, содержащий чисто виртуальную функцию.

Вторая - это виртуальная функция (то есть «нормальная» виртуальная функция). Класс обеспечивает реализацию для этой функции, но его производный класс может переопределить эту реализацию, предоставив собственную реализацию для этого метода.

Другие советы

Первый — «чисто виртуальный» — он сделает класс абстрактным, попытка создать его экземпляр приведет к ошибкам компилятора.Он предназначен для использования в качестве базового класса, где производный класс реализует необходимое поведение, реализуя чисто виртуальную функцию.Вам не обязательно реализовывать функцию в базовом классе, хотя вы можете это сделать.
Этот шаблон часто используется для двух шаблонов проектирования:

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

Второе объявление — это просто объявление обычной виртуальной функции-члена.Вы получите ошибки компилятора, если вам не удастся реализовать функцию-член в базовом классе.Он по-прежнему виртуальный, что означает, что может быть полезно переопределить поведение в производном классе.

Первый не обязательно должен быть реализован в базовом классе, но требует его реализации в унаследованных классах.

Вы должны реализовать второй в базовом классе, и он может быть реализован в унаследованных классах.

Как правило, при наследовании вы вынуждены переопределять первый, и разрешено переопределять второй.

Исходя из Java, не так ли?

Я думаю, что вы смешиваете термины ...

virtual void x() = 0;

- это чисто виртуальная функция или абстрактная функция. Это виртуальная функция без реализации. Вы говорите о чистом абстрактном классе, который является эквивалентом интерфейса на языке c ++, о классе, имеющем только абстрактные функции.

virtual void x();

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

  

virtual void CalculateBase () = 0;

Первая функция - это виртуальная функция Pure, реализация которой не может быть выполнена в классе, и она действует как чистый абстрактный класс или интерфейсный класс. Конкретная реализация должна быть сделана или переопределена в подклассе. Он действует как интерфейсный класс для своих производных классов.

  

virtual void CalculateBase ();

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

В Java

virtual void calculateBase() = 0;  

будет

abstract void calculateBase();

и

virtual void calculateBase();

будет

void calculateBase();

Чтобы быть совершенно ясным,

final void calculateBase();

в C ++ - это "то же самое" а <*>

на Java. То есть final - это значение по умолчанию. в C ++. Однако есть исключение из этого правила. При создании подкласса класса с помощью виртуального метода и его повторной реализации без использования виртуального ключевого слова метод в подклассе не будет окончательным.

Вторая функция должна иметь реализацию в классе, который ее объявляет (отсутствие '= 0'), и может быть переопределено подклассами.

Первая функция может иметь или не иметь реализацию в классе, который ее объявляет, а имеет , которая должна быть реализована подклассами

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top