Возможный дубликат:
C++, Виртуальный/Чистый Виртуальный ОбъясненныйКаково различие между чистой виртуальной функцией и виртуальной функцией?
Я знаю, что "Чистой Виртуальной функцией является Виртуальная функция без тела", но что делает это означает и что на самом деле сделано строкой ниже:
virtual void virtualfunctioname() = 0
Виртуальная функция делает свой класс полиморфным базовым классом . Производные классы могут переопределять виртуальные функции. Виртуальные функции, вызываемые с помощью указателей / ссылок базового класса, будут разрешены во время выполнения. То есть, динамический тип объекта используется вместо его статического типа :
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
и ] по умолчанию
.
Фактически вы можете предоставить реализации чистых виртуальных функций на C ++. Единственное отличие состоит в том, что все чистые виртуальные функции должны быть реализованы производными классами, прежде чем можно будет создать экземпляр класса.
Для виртуальной функции вам необходимо предоставить реализацию в базовом классе. Однако производный класс может переопределить эту реализацию своей собственной реализацией. Обычно для чисто виртуальных функций реализация не предусмотрена.Вы можете сделать функцию чистой виртуальной с помощью = 0
в конце объявления функции. Кроме того, класс, содержащий чистую виртуальную функцию, является абстрактным, т.е. вы не можете создать объект этого класса.
Чистая виртуальная функция обычно не реализуется (но может быть реализована) в базовом классе и должна быть реализована в подклассе листа.
Вы обозначаете этот факт, добавляя "= 0" к объявлению, например, так:
class AbstractBase
{
virtual void PureVirtualFunction() = 0;
}
Затем вы не можете объявить и инстанцировать подкласс без реализации в нем чистой виртуальной функции:
class Derived : public AbstractBase
{
virtual void PureVirtualFunction() override { }
}
Добавив ключевое слово override
, компилятор убедится, что существует виртуальная функция базового класса с такой же сигнатурой.