2013-03-06 3 views
8

Я задал свой главный вопрос в названии. Я не повторяю этого. (СУХОЙ: D)В чем разница между абстрактным классом и чистым абстрактным классом в C++?

Изменить: Пример:

итераторы являются чистыми абстракциями: Все, что ведет себя как итератора является итератор.

Что это значит?

+6

Я не думаю, что C++ делает такое различие. Некоторые пользователи могут это сделать, если это важно в каком-то контексте, но часто это не так. Если это так, вы должны спросить тех пользователей, что они означают. –

+1

Где вы слышали эти условия? Спроси их! – Nawaz

+0

Возможный дубликат [чистого абстрактного класса и интерфейса] (http://stackoverflow.com/questions/2091893/pure-abstract-class-and-interface) – unwind

ответ

23

аннотация класс имеет хотя бы одну чистую виртуальную функцию. Это стандартная терминология C++.

Некоторые люди используют термин чистый абстрактный класс, чтобы описать класс, который имеет только чистые виртуальные функции (другими словами, нет элементов данных и никаких конкретных функций). Это эквивалентно интерфейсам Java.

Теперь ваш актуальный вопрос:

итераторы являются чистыми абстракциями: Все, что ведет себя как итератор итератор.

Это не имеет никакого отношения к абстрактным классам (чистым или иным образом). Все это говорит о том, что все, что соответствует контракту итератора, является итератором. Это даже не должно быть классом (думаю, указатели).

4

Я бы подумал, что чистый абстрактный класс является эквивалентом интерфейса C++.

См here:

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

14

Ничего. Стандарт C++ утверждает только, что a) класс является абстрактным, если он имеет хотя бы одну чистую виртуальную функцию, прямую или унаследованную, и b), вы не можете создать экземпляр абстрактного класса напрямую. Нет такого понятия, как чистый абстрактный класс.

+7

Это может быть официально, но это, безусловно, термин в общем использовании. –

5

Абстрактный класс - это класс с некоторой функциональностью, но некоторые из них должны быть реализованы, тогда как чистый абстрактный класс не имеет реализованной функциональности.

Это немного похоже на интерфейс на других языках, таких как C# и Java.

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

0

В C++ нет чистого абстрактного класса. Есть только абстрактный класс и чистая виртуальная функция (функция отмечена = 0). Класс с хотя бы одной чистой виртуальной функцией становится абстрактным. Однако чистая виртуальная функция может иметь реализацию.

+0

Как вы говорите, это приводит к путанице. В C++ «абстрактный» не является ключевым словом, ни «чистым». Как вы сказали, виртуальные функции, обозначенные «= 0», называются «чистыми виртуальными функциями», что является еще одним термином для той же концепции, что и «абстрактные функции». Когда класс * только * имеет чисто/абстрактные функции, общепринятая терминология относится к нему как к «чисто абстрактному классу», хотя в C++ нет специального синтаксиса для явного обозначения всего класса как такового. Как только вы добавляете к этому классу что-либо еще, кроме чистых/абстрактных функций, это уже не «чисто абстрактное», а все-таки «абстрактное». –

+0

Извините, ваша терминология не соответствует стандарту C++. Но вот мы обсуждаем вопрос на C++. – AnatolyS

+0

Это не потому, что слово не используется в стандарте, которого нет. Цель стандарта не распространяется на всю терминологию OO, а также на различные идиомы, которые люди использовали в C++. Применение термина «чистый» к классу совершенно законно. Возможно, мы могли бы сказать, что нет технических различий в C++ между чистым и нечистым абстрактным базовым классом? –

1

Аннотация Класс * будет иметь по крайней мере одну чистую виртуальную функцию и может иметь элементы данных.

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

Для получения дополнительной информации посетите: (https://en.wikibooks.org/wiki/C%2B%2B_Programming/Classes/Abstract_Classes/Pure_Abstract_Classes)

0

В вашем примере, вы говорите о итераторах. В C++ и, более конкретно, в стандартной библиотеке термин Итераторы не относятся к чисто абстрактному классу, а к тем, что называется понятиями. Концепции используются с шаблонами, а не с полиморфизмом на основе виртуальных/наследований. В настоящее время (C++ 11) понятия определены только в документации библиотеки, т. Е. Они пока не существуют как часть языка C++. Стандартные концепции библиотечных документов, например концепция «Итератор», как набор требований для любого типа/объекта, подлежащего принятию в качестве параметра типа шаблона, который хочет работать с «Итератором». Набор требований определяется в терминах, какие выражения действительны для объекта независимо от его типа. Это форма утиной печати. Например, см.: http://en.cppreference.com/w/cpp/concept/Iterator

Смежные вопросы