Являются ли абстрактные методы и чисто виртуальные функции одним и тем же? - PullRequest
51 голосов
/ 04 июля 2011

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

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

Ответы [ 5 ]

55 голосов
/ 04 июля 2011

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

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

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

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

15 голосов
/ 04 июля 2011

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

6 голосов
/ 04 июля 2011

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

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

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

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

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

5 голосов
/ 04 июля 2011

В C ++ чисто виртуальная функция-член приводит к тому, что тип включения является «абстрактным типом».

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

3 голосов
/ 04 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...