Являются ли абстрактные методы и чистые виртуальные функции одинаковыми?

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

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

Ответ 1

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

Ситуация с чистыми виртуальными функциями и абстрактными классами в С++ аналогична ситуации, когда они по существу означают одно и то же. Любой абстрактный класс должен иметь как минимум 1 чистую виртуальную функцию, иначе он может быть создан и не будет абстрактным. Аналогично, любой класс с не менее чем 1 чистой виртуальной функцией должен быть абстрактным, потому что его необходимо расширить, чтобы фактически реализовать метод.

Следовательно, класс является абстрактным тогда и только тогда, когда содержит не менее 1 чистой виртуальной функции/абстрактного метода.

В дальнейшем языки, такие как Java и С#, сделали такие вещи более явными, позволяя специальному ключевому слову определять абстрактный класс класса, а не наличие чистой виртуальной функции. С++ позволяет вам делать то же самое, что и эти языки, но они немного более подробно об этом.: D

Ответ 2

Вы явно не объявляете классы или методы абстрактными в С++. Наличие чистых виртуальных методов делает их абстрактными.

Ответ 3

В С++ чистая виртуальная функция-член приводит к тому, что охватывающий тип является "абстрактным типом".

сами функции не могут быть абстрактными, хотя этот термин часто неправильно используется таким образом.

Ответ 4

Да, абстрактные методы - это то же самое, что и чистые виртуальные функции; термины часто используются взаимозаменяемо. IMO, "Чистая виртуальная функция" - это технически правильный термин С++, который специально указывает на то, что функция установлена ​​на 0:

class myClass {
public:
  virtual void vfunc() = 0; // pure specifier
};

Абстрактный класс определяемый:

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

Таким образом, абстрактный класс является абстрактным классом, потому что он предназначен для базового класса (некоторые базовые классы по определению должны иметь реализуемые методы, которые должны быть чистыми виртуальными). Эти классы становятся абстрактными классами просто по тому, как они используются и расширяются. В отличие от языков, таких как Java, нет модификатора ключевого слова abstract или interface, поэтому нам нужен "вербальный договор", чтобы говорить об абстрактных классах на С++.

Ответ 5

Я бы сказал, да, абстрактные методы и чистые виртуальные функции концептуально одинаковы.

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

Класс с не менее чем 1 чистой виртуальной функцией называется абстрактным классом.