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