Различие между виртуальной функцией и чистой виртуальной функцией [дубликат]

Возможный дубликат:
C++, Виртуальный/Чистый Виртуальный Объясненный

Каково различие между чистой виртуальной функцией и виртуальной функцией?

Я знаю, что "Чистой Виртуальной функцией является Виртуальная функция без тела", но что делает это означает и что на самом деле сделано строкой ниже:

virtual void virtualfunctioname() = 0
201
задан Community 23 May 2017 в 01:55
поделиться

4 ответа

Виртуальная функция делает свой класс полиморфным базовым классом . Производные классы могут переопределять виртуальные функции. Виртуальные функции, вызываемые с помощью указателей / ссылок базового класса, будут разрешены во время выполнения. То есть, динамический тип объекта используется вместо его статического типа :

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

Чистая виртуальная функция - это виртуальная функция, объявление которой заканчивается на = 0 :

class Base {
  // ...
  virtual void f() = 0;
  // ...

Чистая виртуальная функция неявно делает класс, для которого она определена, абстрактным (в отличие от Java, где у вас есть ключевое слово для явного объявления абстрактного класса). Невозможно создать абстрактные классы. Производные классы должны переопределять / реализовывать все унаследованные чистые виртуальные функции. Если они этого не сделают, они тоже станут абстрактными.

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


Обратите внимание, что в C ++ 11 появилось новое применение для удаления и по умолчанию ключевые слова, которые похожи на синтаксис чистых виртуальных функций:

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

См. этот вопрос и этот для получения дополнительной информации об этом использовании delete и ] по умолчанию .

250
ответ дан 23 November 2019 в 05:04
поделиться

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

8
ответ дан 23 November 2019 в 05:04
поделиться

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

29
ответ дан 23 November 2019 в 05:04
поделиться

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

Вы обозначаете этот факт, добавляя "= 0" к объявлению, например, так:

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

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

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

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

20
ответ дан 23 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

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