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


Возможные Дубликаты:
C++ Virtual / Pure Virtual Explained

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

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

virtual void virtualfunctioname() = 0
4 166

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++. Единственное различие заключается в том, что все чистые виртуальные функции должны быть реализованы производными классами, прежде чем класс может быть создан.